如果已经在 window.open 中打开,Javascript 将窗口置于前面?

IT技术 javascript
2021-02-22 03:18:39

如果您打开一个窗口,例如:

window.open ("url","winName","location=0,width=300,height=214");

如果winName已经打开它只是更改窗口中的 URL。这没问题,但如果该窗口在当前窗口后面,大多数用户不会意识到这一点,并认为它只是没有打开。

有没有办法,如果窗户已经打开,它会把它带到前面?

6个回答

更新:自 Chrome(21 岁以上)起此方法无效。解决方法是关闭/重新打开。

window.open()方法返回表示新窗口中的对象。你只需要window.focus()它:

var w = window.open ("url","winName","location=0,width=300,height=214");
w.focus();

或者干脆:

window.open("url","winName","location=0,width=300,height=214").focus();
如果弹出窗口没有在同一应用程序主机中打开其他浏览器选项卡,则这仅适用于 IE。即使弹出窗口的焦点在其他选项卡上,它也会在 IE9 中默默地失败,可能也是旧版本。幸运的是(?),从一组选项卡中取消弹出选项卡保留了正确的主机窗口引用,并且它将恢复按预期运行。
2021-05-20 03:18:39

建议使用任何形式的各种答案.focus()可能不适用于所有浏览器。

曾经在当天有效,但不再有效,主要是由于浏览器努力积极阻止可疑广告网络将其弹出式广告推送到前台。

特别是在 Mozilla Firefox 中(取决于您的版本),默认情况下启用一个配置设置,以阻止其他窗口(例如弹出窗口)聚焦自身。

您可以在about:config页面中找到此设置(请仔细阅读!)

dom.disable_window_flip: true

如果我没记错的话,这个设置曾经被称为 ~"allow_raise_or_lower_windows*

其他浏览器可能会实现类似的东西,但很简单,如果主要浏览器之一.focus()默认阻止使用,那么尝试调用它就没有多大用处。

因此,我见过的唯一可行的解​​决方案是查看窗口是否存在,并且尚未关闭……如果关闭,则加载所需的窗口。

function closePopupIfOpen(popupName){
  if(typeof(window[popupName]) != 'undefined' && !window[popupName].closed){
    window[popupName].close();
  }
}

打开弹出窗口时,如果它有可能已经打开(并隐藏在其他窗口后面),那么您可以在尝试打开弹出窗口之前调用此函数。

closePopupIfOpen('fooWin');
var fooWin = window.open('someURL', 'foo', '...features...');

当然,缺点是如果该窗口中有任何“重要”的东西(例如部分填写的表格),它就会丢失。

这在 Chrome (70) 中对我有用,但在 FF (63) 中不起作用。我如何让你的脚本工作是通过将窗口定义为全局变量而不是方法的范围。我希望这可以帮助其他人。
2021-04-21 03:18:39
在 chrome 中工作,但在 IE11 中看起来没有任何效果
2021-05-02 03:18:39

更新:自 Chrome(21 岁以上)起此方法无效。解决方法是关闭/重新打开。

要小心,因为当你打开一个新窗口时,opener 窗口可能还有一些代码要执行,也许这些代码中的一些给了它焦点。你会看到你的新窗口是如何在前面打开然后突然转到后面的,因此,在这些情况下,设置一个超时以便稍后将焦点放在新窗口上是一个好主意,当所有开启器窗口中的javascript被执行,你可以这样做:

    setTimeout(function(){window.focus();},1000);

等待的毫秒数为 1000,而 window 是打开的窗口的名称。例如,您还可以在主体 onload 的打开窗口中使用此代码。

我通过添加解决了这个问题

onclick="myWin = window.open('','winName','location=0,width=300,height=214'); myWin.focus()"

到 html 元素(按钮),然后通过 JS 更改 URL。

在 chrome 中效果很好 尚未在其他浏览器中测试
2021-05-19 03:18:39

window.focus() 应用于有问题的窗口应该可以解决问题。

如果您像这样内联调用 focus() 它将不起作用,因为该窗口尚不存在。你应该做的是在打开的窗口(这里是editDaySched)中有一个函数,当 onload 事件触发时调用 window.focus() 。您可以使用 setTimeout 在 5 或 6 秒后聚焦 editDaySched 窗口,从 opener 进行概念验证。
2021-04-28 03:18:39
你能给我一个我试过的例子吗:editDaySched = window.open(...); editDaySched.focus();在 Chrome 中,但它似乎没有用。谢谢。
2021-05-15 03:18:39