如何检测浏览器是否阻止了弹出窗口?

偶尔,我遇到了一个试图弹出一个新窗口(用于用户输入或重要的东西)的网页,但弹出窗口阻止程序阻止了这种情况的发生。

调用窗口可以使用哪些方法来确保新窗口正确启动?

0
额外 编辑
意见: 2

5 答案

如果您使用JavaScript打开弹出窗口,则可以使用如下所示的内容:

var newWin = window.open(url);             

if(!newWin || newWin.closed || typeof newWin.closed=='undefined') 
{ 
    //POPUP BLOCKED
}
0
额外
它不适用于Chrome ;-(更好地使用凯文B解决方案波纹管..
额外 作者 sly63,
这里是Chrome的一个答案:检测阻止弹出在铬
额外 作者 ajwaka,
请阅读以下内容: stackoverflow.com/a/20235765/2892117
额外 作者 Shekhar Joshi,

我已经尝试了很多解决方案,但是我唯一能够想到的方法也是与uBlock Origin合作,通过利用超时来检查弹出窗口的关闭状态。

function popup (url, width, height) {
    const left = (window.screen.width / 2) - (width / 2)
    const top = (window.screen.height / 2) - (height / 2)
    let opener = window.open(url, '', `menubar=no, toolbar=no, status=no, resizable=yes, scrollbars=yes, width=${width},height=${height},top=${top},left=${left}`)

    window.setTimeout(() => {
        if (!opener || opener.closed || typeof opener.closed === 'undefined') {
            console.log('Not allowed...') // Do something here.
        }
    }, 1000)
}

显然这是一种黑客行为;像这个问题的所有解决方案。

你需要在你的setTimeout中提供足够的时间来考虑最初的开放和关闭,所以它永远不会是完全准确的。这将是一个反复试验的位置。

将其添加到您的尝试列表中。

0
额外

This solution for popup blocker checking has been tested in FF (v11), Safari (v6), Chrome (v23.0.127.95) & IE (v7 & v9). Update the _displayError function to handle the error message as you see fit.

var popupBlockerChecker = {
    check: function(popup_window){
        var _scope = this;
        if (popup_window) {
            if(/chrome/.test(navigator.userAgent.toLowerCase())){
                setTimeout(function() {
                    _scope._is_popup_blocked(_scope, popup_window);
                },200);
            }else{
                popup_window.onload = function() {
                    _scope._is_popup_blocked(_scope, popup_window);
                };
            }
        } else {
            _scope._displayError();
        }
    },
    _is_popup_blocked: function(scope, popup_window){
        if ((popup_window.innerHeight > 0)==false){ 
            scope._displayError();
        }
    },
    _displayError: function(){
       alert("Popup Blocker is enabled! Please add this site to your exception list.");
    }
};

用法:

var popup = window.open("http://www.google.ca", '_blank');
popupBlockerChecker.check(popup);

希望这可以帮助! :)

0
额外
没有工作过我Chrome(v26.0.1410.64)
额外 作者 Surendra Jnawali,
我认为你需要更多的下划线
额外 作者 Jacob Stamm,

我尝试了上面的一些例子,但是我无法让他们使用Chrome。这个简单的方法似乎可以与Chrome 39,Firefox 34,Safari 5.1.7和IE 11一起使用。下面是我们JS库中的代码片段。

openPopUp: function(urlToOpen) {
    var popup_window=window.open(urlToOpen,"myWindow","toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, copyhistory=yes, width=400, height=400");            
    try {
        popup_window.focus();   
    } catch (e) {
        alert("Pop-up Blocker is enabled! Please add this site to your exception list.");
    }
}
0
额外
请问@Surendra,你能说明你的意思是“不工作”吗?解析时发生错误?运行时出错?弹出窗口打开但被标记为阻止?弹出窗口被阻止但被标记为打开?我没有看到任何理由为什么资源管理器会失败,除非允许在NULL上调用focus(),在这种情况下,在尝试之前对NULL进行测试才能正常工作。
额外 作者 FrancescoMM,
它在IE中不适合我
额外 作者 Surendra,

不管浏览器公司或版本如何,一个“解决方案”都可以工作,只需在屏幕上放置一个警告消息,在接近控制点的某个位置创建一个弹出窗口,礼貌地警告用户该行动需要弹出窗口,并请为该网站启用它们。

我知道这不是什么花哨的东西,但它不会变得更简单,只需要大约5分钟的测试,然后就可以进入其他的噩梦。

一旦用户允许您的网站弹出窗口,如果您不过度弹出窗口,也会考虑周到。你想做的最后一件事是烦扰你的访客。

0
额外
谢谢,但不用谢谢。
额外 作者 FrancescoMM,
那么,@FrancescoMM,你非常欢迎!
额外 作者 UncaAlby,
不幸的是,有时这个问题中的所有其他解决方案都不可接受 - 只有这一个。为什么?因为他们都试图显示一个弹出窗口 - 不只是检测弹出窗口是否启用。如果我想默默地做,该怎么办?
额外 作者 Sagi Mann,