检测被阻止的弹窗而不需要打开一个弹窗

5
这个问题已经被提出很多次,即“如何检查我的浏览器是否阻止了弹出窗口”,我找到的所有解决方案都提出了一种新的弹出窗口打开测试的解决方案。
参考资料:
1. “在Chrome中检测被阻止的弹出窗口” 2. “如何检测浏览器是否阻止了弹出窗口?
等等。
我想知道是否有可能知道一个被阻止的弹出窗口,而不实际打开一个。
因为由于许多原因,测试弹出窗口可能需要时间关闭,在您的应用程序的起始页上看起来很丑。
例如,如果我们可以使用客户端的请求头中的任何内容,来了解弹出窗口的偏好设置等,就像我们可以获取语言偏好设置一样。
这将是一个巨大的帮助。谢谢。

解决 - 我已经使用cookie将弹出窗口检测测试代码放置在其中。因此,如果未阻止弹出窗口,则每个月进行一次测试。此外,我已经减小了窗口大小,使其尽可能不易被注意到。 - nexus
1个回答

5
据我所知,弹窗拦截器的工作原理是重写 window.open 函数,并在大多数情况下返回 null。因此,一种方法是检测 window.open 是否仍为本地函数。
您可以使用 toString 方法来测试它,该方法将[native code] 作为该函数的主体返回。但 toString 不适用于旧版 IE,因此请使用 ''+ 来转换函数。 var havePopupBlockers = ('' + window.open).indexOf('[native code]') === -1; 这不是银弹,但可以检测潜在风险。我在 Chrome、FF、IE8 和 IE9 上进行了一些不同的弹窗拦截器测试,效果很好。

这是一个有趣的技巧。谢谢分享! - Andrew Ensley
什么是本地代码?我如何从浏览器获取? - Hasmukh Ahir
@HasmukhBaldaniya 当你将某些本地函数转换为字符串时,函数内容会呈现为“[native code]”。例如: '' + window.open // 返回 'function open() { [native code] }' - Vlada
的确很有趣,而且有效! - nickanor
1
当弹出窗口被阻止时,它不会返回true。 - Nidhi Dadiya
这个不起作用。浏览器没有覆盖这个方法。可以通过打开弹出窗口拦截器并通过用户点击按钮来调用弹出窗口来证明这一点。弹出窗口将成功弹出。在同一页上,不需要用户交互的情况下打开另一个弹出窗口,观察弹出窗口失败。弹出窗口拦截器是根据弹出窗口的调用方式来触发的,这意味着浏览器没有直接修改window对象上的任何内容。 - undefined

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