Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 弹出窗口阻止程序API-如何检查用户是否已启用它_Javascript_Google Chrome_Window_V8_Popup Blocker - Fatal编程技术网

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

Javascript 弹出窗口阻止程序API-如何检查用户是否已启用它,javascript,google-chrome,window,v8,popup-blocker,Javascript,Google Chrome,Window,V8,Popup Blocker,我需要知道用户何时单击触发窗口的按钮。打开是否有稳定的API/way,事先知道用户是否主动拥有弹出窗口拦截器 在某些情况下,用户不知道/不注意他们有弹出窗口拦截器(阻止新窗口)。我想通过一些对话框/或其他方式通知他们,通过单击“允许”来授权新窗口。window.open()仅在不是由单击事件触发的情况下才会被阻止 要确认窗口已加载,请执行以下操作: var-load=false; 函数windowLoaded(){ 警报(“加载的弹出窗口”); 已加载=真 } 函数暂停(毫秒){ var dt=

我需要知道用户何时单击触发
窗口的按钮。打开
是否有稳定的API/way,事先知道用户是否主动拥有弹出窗口拦截器

在某些情况下,用户不知道/不注意他们有弹出窗口拦截器(阻止新窗口)。我想通过一些对话框/或其他方式通知他们,通过单击“允许”来授权新窗口。

window.open()仅在不是由单击事件触发的情况下才会被阻止

要确认窗口已加载,请执行以下操作:
var-load=false;
函数windowLoaded(){
警报(“加载的弹出窗口”);
已加载=真
}
函数暂停(毫秒){
var dt=新日期();
while((new Date())-dt
Window.open(…)
返回新窗口的句柄(如果它存在)。如果它没有新窗口的句柄,这很好地表明该窗口已被阻止

发件人:

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

恐怕没有办法解决这个问题。我不久前也研究过这个问题,我正在分享我的发现

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

如果弹出窗口与用户的操作直接相关,则智能弹出窗口阻止程序将允许弹出窗口。如果弹出窗口被延迟,则很有可能被阻止

参考:安迪·斯特拉顿(他的博客)

我更喜欢这个解释

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

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

我们能做什么?

到目前为止,有一件事是非常清楚的,那就是没有任何直接的方法可以从代码中调整弹出窗口拦截器。我认为这背后的原因是,它会阻碍它存在的唯一原因

你可以在Andy的博客上看到他的解决方案:。如果我必须写下他简短的解释,我会直接说使用弹出窗口作为响应部分。Andy解释说,我们可以使用
窗口。直接调用用户的操作后,在响应部分打开
,弹出窗口拦截器不会阻止用户的操作


正如xaxxon所解释的,可以在执行
窗口后检查。打开
检查它是否被阻止。一般来说,这是人们做的事情,开发人员在使用任何额外的服务功能时都要记住这一点。例如,我在实现twitter的数字身份验证系统。我过去常常在失败后检查消息n执行弹出命令,然后我可以向用户显示一条消息以启用弹出窗口,但我找到了上面提到的解决方案。它使整个过程更加整洁干净。

使用此代码进行检查

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.");
}};

下面是一个弹出窗口阻止程序检查的jQuery解决方案。它已经在FF(v11)、Safari(v6)、Chrome(v23.0.127.95)和IE(v7和v9)中进行了测试

用法:-

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

希望能有所帮助。

作为旁白,“如何知道他在窗口打开之前是否启用了弹出窗口阻止程序”查看是否需要粗略估计用户是否正在运行adblocker。@jake adblocker场景将在这里提供帮助?我们正在谈论
windows。打开
。adblocker也有弹出窗口阻止功能,特别是对于像Firefox这样弹出窗口阻止功能较弱的浏览器。检测adblocker非常简单。
 var popup = window.open("http://www.google.com.au", '_blank');
 popupBlockerChecker.check(popup);
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);