选项卡时如何将焦点设置为子窗口和开启窗口

mag*_*tte 7 javascript browser

在另一个浏览器选项卡中,如何将焦点设置回父窗口?我试过了:

window.opener.focus();
Run Code Online (Sandbox Code Playgroud)

无济于事.它似乎只在窗口没有停靠时工作.

我需要在Chrome,IE9/10,Firefox和Safari中使用它.

Internet Explorer似乎也有问题将焦点设置到子窗口.例如,使用时:

var windowRef = window.open(url);
Run Code Online (Sandbox Code Playgroud)

然后从同一个标签:

windowRef.focus(); // ok in Chrome, doesn't seem to work in IE...
Run Code Online (Sandbox Code Playgroud)

小智 0

您究竟想实现什么目标?将另一个窗口内的焦点设置到第一个链接/按钮/表单字段/其他什么?或者使另一个窗口(浏览器选项卡)成为活动浏览器选项卡?

无论如何 - 也许opener.focus()调用不起作用,因为两个窗口不是从同一源提供服务的。尝试通过postMessage设置通信通道来解决此问题。所以在opener文档中,监听这样的事件:

window.addEventListener('message', function (event) {
    window.focus();
}, false);
Run Code Online (Sandbox Code Playgroud)

在打开的窗口中,发送如下消息:

opener.postMessage('foo', '*');
Run Code Online (Sandbox Code Playgroud)

遗憾的是,我现在无法测试这是否有效。(不过我想应该是这样……)

不过,有几点需要补充:

  1. 一些旧版垃圾浏览器不支持 postMessage(请参阅caniuse.com)。不过,还是有解决方法的。:)
  2. 我使用 W3 标准符号来附加事件侦听器。IE8 及更低版本使用其专有的attachEvent等效项。
  3. 您应该将'*'原点通配符替换为打开窗口的实际原点。
  4. 在消息事件侦听器函数中,您应该检查 event.origin,并且仅在来源正确时才运行实际的有效负载。