弹出阻止程序API-如何检查用户是否已启用它

Joh*_*rby 22 javascript google-chrome v8 window popup-blocker

我需要知道用户点击触发的按钮,window.open如果有稳定的API /预先知道用户是否主动拥有弹出窗口阻止程序?

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

xax*_*xon 29

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();
}
Run Code Online (Sandbox Code Playgroud)


Gan*_*ite 5

\n

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

\n
\n\n

恐怕没有任何方法可以处理这个问题。我不久前研究过同样的问题,现在分享我的发现。

\n\n

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

\n\n

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

\n\n

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

\n\n

我更喜欢这个解释

\n\n

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

\n\n

参考:dthorpe(Stack Overflow 用户名)

\n\n

我们能做什么?

\n\n

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

\n\n

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

\n\n

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

\n