点击事件后在Safari和Chrome中无法打开新窗口

11

我正在尝试打开一个新窗口,代码如下:

$('#wrapper').click(function() {
    window.setTimeout(function() {
        //alert('hi');
        window.open("http://example.com", "ExternalLinks", "resizable=yes, scrollbars=yes, status=yes");
    }, 1000);
});

这在Firefox中有效,但在Chrome或Safari中不起作用(到目前为止,我只在Mac上进行了测试)。alert()在所有浏览器中都有效,因此似乎有些东西阻止了在Safari / Chrome中执行window.open。此外,如果我删除setTimeout并仅调用window.open,那么在所有3个浏览器中都可以工作。就像如果window.openclick事件相距太远,则在Safari / Chrome中它就无法正常工作。

所以,你知道,我拥有一个全Flash网站,我试图使外部链接在新窗口中打开,因此我正在读取URL中的哈希标签(例如htp://example.com/#/facebook/),如果匹配某些项目,则调用window.open打开特定的URL。我无法访问Flash源文件,否则我会在那里处理此操作。

有任何想法吗?

3个回答

15

Safari/Chrome内置了弹出窗口拦截器以阻止此类弹出。在Safari/Chrome中,唯一允许打开新窗口的JavaScript是直接附加到单击处理程序(和其他直接用户输入处理程序)的JavaScript。在过去的版本中,人们想出了一些欺骗的方法(例如生成其他元素--表单或div--并使用JavaScript模拟用户输入),但较新的版本更聪明地检测到了这一点。我建议重新配置事物,使您不再使用延迟弹出窗口--毕竟,这种弹出窗口通常会对用户造成震动。


1
值得注意的是,尽管Safari和Chrome内置了这些严格的弹出窗口拦截器并默认启用,但其他浏览器也有这些功能--只是对于其他浏览器来说,它们要么是附加组件,要么在安装时不会自动启用。 - Ben Lee

8

我通过检查 window.open() 的返回值是否为 undefined 来解决了这个问题。如果是 true,则调用 alert() 并向用户显示一条消息以禁用其弹出窗口拦截器。

var myWin = window.open([args]);

if (myWin == undefined)
   alert('Please disable your popup blocker');

1
有用的回复。谢谢。 - matthewpavkov

0

另一种解决方法
只需打开一个带有“接受”和“取消”选项的弹出窗口,并将window.open操作附加到“接受”按钮上,它就会起作用。这对我有效...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接