【发布时间】:2017-01-19 00:26:56
【问题描述】:
我需要知道用户点击触发window.open的按钮是否有稳定的API/方式提前知道用户是否主动有弹窗拦截器?
在某些情况下,用户不知道/注意他们有弹出窗口阻止程序(阻止新窗口)。我想通过一些对话框/或其他方式通知他们通过单击允许来授权新窗口。
【问题讨论】:
标签: javascript google-chrome window v8 popup-blocker
我需要知道用户点击触发window.open的按钮是否有稳定的API/方式提前知道用户是否主动有弹窗拦截器?
在某些情况下,用户不知道/注意他们有弹出窗口阻止程序(阻止新窗口)。我想通过一些对话框/或其他方式通知他们通过单击允许来授权新窗口。
【问题讨论】:
标签: javascript google-chrome window v8 popup-blocker
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...");
}
【讨论】:
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();
}
【讨论】:
这是你的问题 - 我需要一些稳定的解决方案如何知道 当用户点击打开窗口的事件时,如何知道他是否 启用弹出窗口拦截器。 在窗口之前 打开...谢谢!
恐怕没有任何方法可以处理它。不久前我研究了同样的问题,我正在分享我的发现。
为什么我们的弹出窗口被屏蔽了?
如果弹出窗口直接与用户的操作相关联,则智能弹出窗口拦截器将允许弹出窗口。如果无论如何延迟,它很有可能会被阻止。
参考:Andy Stratton(他的博客)
我更喜欢这个解释
一般规则是,如果从不是由直接用户操作调用的 javascript 调用 window.open 或类似内容,则会启用弹出窗口阻止程序。也就是说,您可以调用 window.open 来响应按钮单击而不会被弹出窗口阻止程序击中,但是如果您将相同的代码放入计时器事件中,它将被阻止。调用链的深度也是一个因素 - 一些较旧的浏览器只查看直接调用者,较新的浏览器可以回溯一点以查看调用者的调用者是否是鼠标点击等。保持尽可能浅以避免弹出窗口阻止程序。
参考:dthorpe(堆栈溢出用户名)
我们能做什么?
到目前为止,有一点非常清楚,即没有任何直接的方法可以使用代码中的弹出阻止程序进行调整。我认为它背后的原因是,它会阻碍它存在的唯一原因。
您可以阅读安迪在他的博客上提出的解决方案:Click。如果我必须写下他简短解释的内容,我会直接说使用弹出窗口进行响应部分。 Andy 解释说,在直接对用户的操作进行调用后,我们可以在响应部分使用windows.open,不会被弹出窗口阻止程序阻止。
就像 xaxxon 解释的那样,可以在执行 windows.open 后检查它是否被阻止。通常这就是人们所做的事情,开发人员在制作任何额外的服务功能时要记住这一点。例如,我正在实现 twitter 的数字认证系统。我曾经在执行弹出命令失败后检查消息,然后我可以向用户显示一条消息以启用弹出窗口,但后来我找到了上面提到的解决方案。它使整个事情更加整洁和干净。
【讨论】:
windows.open。
使用此代码检查
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);
【讨论】:
以下是弹出窗口拦截器检查的 jQuery 解决方案。它已在 FF (v11)、Safari (v6)、Chrome (v23.0.127.95) 和 IE (v7 & 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);
希望它会有所帮助。
【讨论】: