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

时间:2016-09-11 11:19:33

标签: javascript google-chrome window v8 popup-blocker

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

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

5 个答案:

答案 0 :(得分:24)

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();
}

答案 1 :(得分:4)

  

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

恐怕没有任何方法可以解决这个问题。我不久前研究了同样的问题,我正在分享我发现的东西。

为什么我们的弹出窗口会被屏蔽?

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

参考:Andy Stratton(他的博客)

我更喜欢这个解释

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

参考:dthorpe(堆栈溢出用户名)

我们可以做些什么?

现在有一点很清楚,没有任何直接的方法来调整代码中的弹出窗口阻止程序。我认为其背后的原因是,它将阻碍其存在背后的唯一原因。

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

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

答案 2 :(得分:3)

如果没有点击事件触发,

window.open()通常只会被阻止。

确认窗口已加载:

var loaded = false;

function windowLoaded() { 
  alert("The popup loaded"); 
  loaded = true
}

function pause(milliseconds) {
  var dt = new Date();
  while ((new Date()) - dt <= milliseconds) { /* Do nothing */ }
}

document.write("start...");

//open the window
var win = window.open("window.html");

// If window.open returned an object
if(win) {
  win.onload = function() { 
    win.RunCallbackFunction = windowLoaded; 
  };
  document.write("popup sent...");

  pause(3000);

  // Verify that out window loaded
  if (loaded == false)
    document.write("check you popup blocker!");
  else
    document.write("ok!");

}
else {
  document.write("window.open() was blocked...");
}

答案 3 :(得分:3)

使用此代码检查

var popupBlockerChecker = {check:function(b) {
var a = this;
b ? /chrome/.test(navigator.userAgent.toLowerCase()) ? setTimeout(function()      {
a._is_popup_blocked(a, b);
}, 200) : b.onload = function() {
a._is_popup_blocked(a, b);
} : a._displayError();
}, _is_popup_blocked:function(b, a) {
0 == 0 < a.innerHeight && b._displayError();
}, _displayError:function() {
alert("Popup Blocker is enabled! Please add this site to your exception list.");
}};

,用法类似

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

答案 4 :(得分:2)

以下是弹出窗口阻止程序检查的jQuery解决方案。它已在FF(v11),Safari(v6),Chrome(v23.0.127.95)和IE(v7&amp; v9)。

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.co.in", '_blank');
popupBlockerChecker.check(popup);

希望它会有所帮助。