避免浏览器弹出窗口阻止程序

我正在开发一个纯粹在JavaScript中的OAuth身份验证流,我想在弹出窗口中向用户显示“授予访问权限”窗口,但它被阻止了。

如何防止由其中一个创建的弹出窗口或被不同浏览器的弹出窗口阻止程序阻止?window.openwindow.showModalDialog


答案 1

一般规则是,如果从未被直接用户操作调用的javascript调用或类似内容,则弹出窗口阻止程序将参与其中。也就是说,您可以调用以响应按钮单击而不会被弹出窗口阻止程序击中,但是如果您将相同的代码放在计时器事件中,它将被阻止。调用链的深度也是一个因素 - 一些较旧的浏览器只查看直接调用者,较新的浏览器可以稍微回溯一下以查看调用者的调用者是否是鼠标点击等。尽可能保持浅层以避免弹出窗口阻止程序。window.openwindow.open


答案 2

根据Jason Sebring非常有用的提示,以及这里那里涵盖的内容,我为我的情况找到了一个完美的解决方案:

带有 Javascript 代码段的伪代码:

  1. 立即在用户操作上创建一个空白弹出窗口

     var importantStuff = window.open('', '_blank');
    

    (使用所需的任何其他选项丰富对 的调用。window.open

    可选:添加一些“等待”信息消息。例子:

    a) 外部 HTML 页面:将上述行替换为

     var importantStuff = window.open('http://example.com/waiting.html', '_blank');
    

    b) 文本:在上面的行下面添加以下行:

     importantStuff.document.write('Loading preview...');
    
  2. 准备就绪时用内容填充它(例如,当返回AJAX调用时)

     importantStuff.location.href = 'https://example.com/finally.html';
    

    或者,如果您根本不需要它,可以在此处关闭窗口(例如 - 感谢@Goose的评论):if ajax request fails

     importantStuff.close();
    

我实际上将此解决方案用于mailto重定向,并且它适用于我的所有浏览器(Windows 7,Android)。顺便说一句,该位有助于mailto重定向在移动设备上工作。_blank