允许window.open打开新窗口而不是弹出窗口

8

我有这段JS代码:

window.open(loginurl, '_blank');

举例来说,假设从一个条件开始:

if (userloggedin) {

//popup another page

} else {

window.open(loginurl, '_blank');

}

"loginurl"是我想在一个新窗口打开的登录链接。

问题: 这在大多数浏览器中(Firefox和Chrome)将被阻止,因为它的行为类似于一个弹出窗口。

我希望有一个解决方案仍然利用我的登录URL变量(不改变if else语句),在新窗口中打开它,而没有任何弹出窗口被阻止的警告。

我正在寻找解决方案,但我从未找到过。 如果有人可以提供一些提示或见解,那将非常感激。

谢谢。


1
如果用户在页面上点击某个链接并使用该链接打开弹出窗口,则不应阻止此操作...或者您可能需要进行一些黑帽JS/FLASH黑客攻击。 - Zathrus Writer
2
重复的问题。 - yajay
2个回答

12

window.open打开的窗口,如果没有用户触发的操作,将始终被浏览器视为弹出窗口并进行阻止。

这意味着例如以下情况不会被阻止:

$('a').on('click.open', function(e) { e.preventDefault(); window.open('http://disney.com') });

Chrome甚至允许其他事件触发弹出窗口,而Firefox则不允许这样做:

$(document).on('keydown', function(e) { window.open('http://stackexchange.com') });

这将被阻止:

$(document).ready(function() { window.open('http://stackoverflow.com') });

因此,除非您在用户操作后触发window.open,否则您永远无法确定您的窗口不会被阻止。


应该只使用$('a').on('click',我已经进行了快速搜索,并没有发现像jQuery中的click.open这样的事件(尽管您的示例确实有效)? - Barry Kaye
2
@BarryKaye 'click.open' 是一个命名空间的点击事件处理程序。('click' 是事件,'open' 是命名空间。这意味着,例如,如果您想解除绑定它而不解除同一元素上的任何其他点击事件,可以通过调用 $ ('a').off('click.open') 来实现。 - Beat Richartz

0

这种方式不会阻止您的弹出窗口:

$.ajax({
    url:"url",
    dataType: "text",
    cache: false,
    success: function(data){
        window.open('url','_self');
   }
});

这不是弹出窗口。 - cocorossello

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