首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >window.opener.focus()不工作

window.opener.focus()不工作
EN

Stack Overflow用户
提问于 2013-08-29 01:52:07
回答 4查看 27K关注 0票数 14

我似乎不能让这件事起作用。

响应点击,窗口A打开窗口B(然后有焦点)。然后,响应B的点击,窗口调用window.opener.focus(),但是焦点不会返回到A。

我为Chrome找到了一个奇怪的解决方案(29,可能还有其他)。如果我跑:

代码语言:javascript
复制
window.opener.name = 'somename';
window.open(window.opener.location.href, window.opener.name);
window.opener.focus();

它确实工作(并且不重新加载窗口A)。但这对火狐不起作用,而且这可能是个侥幸。

在我看来,openerfocus应该做什么是很清楚的,但是window.opener.focus()不起作用。我遗漏了什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-08-29 02:17:03

来自精细手册

发出请求,将窗口带到前面。由于用户设置,它可能会失败,而且在此方法返回之前,窗口不一定是最前面的窗口。

强调我的。调用focus()只是一个请求,浏览器可以随意忽略您,通常您应该会被忽略。考虑一下,如果你需要一个浏览器忽略你的请求的原因,你可以在别人打字的时候把焦点切换到一个很小的窗口,这样你就可以做什么坏事了。

如果您需要focus()来工作您的应用程序,那么您需要重新设计您的应用程序,以便它不需要调用focus()

票数 9
EN

Stack Overflow用户

发布于 2016-01-05 07:37:19

我明白为什么browser/OS不允许子窗口接管焦点(滥用权力)。以下是一个解决办法:

  1. 在父窗口中,在"window.external“中声明一个函数,该函数将触发Javascript”警报()“或”确认()“。
  2. 从子窗口调用该函数。
  3. 浏览器可能忽略来自希望控制焦点的子窗口(例如window.opener.focus())的请求,但浏览器应该响应来自父窗口的请求,该请求触发警报()或确认()操作,需要将焦点集中在父窗口上。

JS家长:

代码语言:javascript
复制
    var child = window.open('child.html', 'child');
    window.external.comeback = function() {
        var back = confirm('Are you sure you want to comback?');
        if(back) {
            child.close();
        } else {
            child.focus();
        }
    }

联署材料儿童:

代码语言:javascript
复制
    // assuming you have jQuery
    $('.btn').click() {
        window.opener.external.comeback();  
    };

--我正在实际应用程序中使用这段代码来处理在子窗口中运行的签出请求,我需要优雅地返回到父窗口。

票数 3
EN

Stack Overflow用户

发布于 2021-11-16 19:07:43

我找到了一个合理的解决办法,使用网络通知

正如在其他一些答案中提到的,在浏览器和操作系统中,window.opener.focus()可能无法工作。

我能够使用postMessage和通知使其工作。

要尝试这一点:在父(opener)选项卡中添加一个“message”事件侦听器,该侦听器通过单击侦听器创建通知:

代码语言:javascript
复制
 window.addEventListener("message", (event) => {
  if (!("Notification" in window)) {
    alert("This browser does not support desktop notification");
  }

  // Let's check whether notification permissions have already been granted
  else if (Notification.permission === "granted") {
    // If it's okay let's create a notification
    var notification = new Notification("The opener needs your attention");

    // Add click listener that will perform a window focus
    notification.onclick = function (x) {
      window.focus();
      this.close();
    };
  }

  // Otherwise, we need to ask the user for permission
  else if (Notification.permission !== "denied") {
    Notification.requestPermission().then(function (permission) {
      // If the user accepts, let's create a notification
      if (permission === "granted") {
        var notification = new Notification("The opener needs your attention");

        // Add click listener that will perform a window focus
        notification.onclick = function (x) {
          window.focus();
          this.close();
        };
      }
    });
  }
});

然后,在需要焦点回到父选项卡时,您需要从子选项卡使用postMessage:

代码语言:javascript
复制
// Called from child tab
window.opener.postMessage(
  {
    message: "focus",
  },
  "*" // cross-origin
);

一旦调用postMessage,就会看到OS通知。如果用户单击此选项卡,则应将其重定向到父(opener)选项卡。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18501095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档