弹出窗口拦截器 API - 如何检查用户是否启用了它

新手上路,请多包涵

我需要知道用户何时单击触发的按钮 window.open 是否有 稳定的 API/方式 来预先知道用户是否主动拥有弹出窗口阻止程序?

在某些情况下,用户不知道/没有注意他们有弹出窗口阻止程序(阻止新窗口)。我想通过一些对话框/或一些东西来通知他们,通过单击允许来授权一个新窗口。

原文由 John Jerrby 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 408
2 个回答

Window.open(...) 返回新窗口句柄(如果存在)。如果它没有新窗口的句柄,则表明该窗口已被阻止。

https://developer.mozilla.org/en-US/docs/Web/API/Window/open

来自: https ://davidwalsh.name/popup-block-javascript

 var windowName = 'userConsole';
var popUp = window.open('/popup-page.php', windowName, 'width=1000, height=700, left=24, top=24, scrollbars, resizable');
if (popUp == null || typeof(popUp)=='undefined') {
    alert('Please disable your pop-up blocker and click the "Open" link again.');
}
else {
    popUp.focus();
}

原文由 xaxxon 发布,翻译遵循 CC BY-SA 3.0 许可协议

那么这是你的问题 - 我需要一些稳定的解决方案如何知道用户何时单击打开窗口的事件, 如何知道他是否启用了弹出窗口阻止程序在窗户打开之前…谢谢!

恐怕没有任何方法可以处理。我前段时间研究过同样的问题,我正在分享我的发现。

为什么我们的弹出窗口被阻止?

如果弹出窗口与用户的操作直接关联,则智能弹出窗口阻止程序将允许弹出窗口。如果它无论如何都延迟了,它很可能会被阻止。

参考资料:Andy Stratton(他的博客)

我更喜欢这个解释

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

参考:dthorpe(Stack Overflow 用户名)

我们能做什么?

到目前为止,一件事非常清楚,没有任何直接的方法可以从代码中调整弹出窗口阻止程序。我认为它背后的原因是,它会妨碍它存在的唯一原因。

您可以阅读 Andy 在其博客上提供的解决方案: 单击。如果我不得不写下他所解释的内容,我会直接说在响应部分使用弹出窗口。安迪解释说,我们可以在响应部分使用 windows.open 在直接对用户的操作进行调用后不会被弹出窗口阻止程序阻止。

就像 xaxxon 解释的那样,可以在执行 windows.open 之后检查它是否被阻止。通常这就是人们所做的,开发人员在制作任何额外的服务功能时要记住这一点。例如,我正在实施 Twitter 的数字身份验证系统。我曾经在执行弹出命令失败后检查消息,然后我可以向用户显示一条消息以启用弹出窗口,但后来我找到了上述解决方案。它使整个事情更加整洁干净。

原文由 Gandalf the White 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏