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

Nat*_*ord 120 popup

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

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

oma*_*mar 143

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

var newWin = window.open(url);             

if(!newWin || newWin.closed || typeof newWin.closed=='undefined') 
{ 
    //POPUP BLOCKED
}
Run Code Online (Sandbox Code Playgroud)

  • @ajwaka 至少今天这段代码似乎可以在 chrome 上运行,因此就有了这个问题。 (3认同)
  • @ajwaka您能否请您澄清一下这个答案对于 chrome 是否失败,或者是否有其他答案更适合 chrome 的原因?谢谢! (2认同)
  • @Crashalot - 你问的是我 6 年前回答过的问题 - 遗憾的是我已经不记得当时的情况了,浏览器在 6 年来已经取得了长足的进步。 (2认同)

小智 38

我尝试了上面的一些示例,但我无法让它们与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.");
    }
}
Run Code Online (Sandbox Code Playgroud)


Kev*_*n B 32

更新:Popups从古代就存在.最初的想法是在不关闭主窗口的情况下显示另一个内容.截至目前,还有其他方法可以做到这一点:JavaScript能够发送服务器请求,因此很少使用弹出窗口.但有时他们仍然很方便.

在过去邪恶的网站滥用弹出窗口很多.糟糕的页面可能会打开大量带有广告的弹出窗口.所以现在大多数浏览器都试图阻止弹出窗口并保护用户.

如果在用户触发的事件处理程序(如onclick)之外调用它们,则大多数浏览器会阻止弹出窗口.

如果你考虑一下,这有点棘手.如果代码直接在onclick处理程序中,那么这很容易.但是setTimeout中的弹出窗口是什么?

试试这段代码:

 // open after 3 seconds
setTimeout(() => window.open('http://google.com'), 3000);
Run Code Online (Sandbox Code Playgroud)

弹出窗口在Chrome中打开,但在Firefox中被屏蔽.

...这也适用于Firefox:

 // open after 1 seconds
setTimeout(() => window.open('http://google.com'), 1000);
Run Code Online (Sandbox Code Playgroud)

不同之处在于Firefox处理超过2000毫秒或更短的超时是可以接受的,但在它之后 - 删除了"信任",假设现在它"在用户操作之外".所以第一个被阻止,第二个被阻止.


当前2012年的原始答案:

该溶液中弹出式窗口拦截检查已在FF(V11),Safari浏览器(V6),铬(v23.0.127.95)IE进行了测试(V7&V9).更新displayError函数以根据需要处理错误消息.

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

用法:

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

希望这可以帮助!:)

  • 我想你需要更多的下划线 (17认同)

Unc*_*lby 11

无论浏览器公司或版本如何,一个始终有效的"解决方案" 是简单地在屏幕上放置一条警告消息,靠近将创建弹出窗口的控件,礼貌地警告用户该操作需要弹出一个弹出窗口并且请为网站启用它们.

我知道它不是花哨或任何东西,但它不能变得更简单,只需要大约5分钟的测试,然后你可以继续做其他的噩梦.

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

  • 不幸的是,有时这个问题中的所有其他解决方案都是不可接受的——只有这个。为什么?因为他们都试图显示一个弹出窗口 - 而不仅仅是检测是否启用了弹出窗口。如果我想默默地做呢? (2认同)