有时候,我遇到一个试图弹出一个新窗口(用于用户输入或重要信息)的网页,但是弹出窗口阻止程序阻止了这种情况的发生。
调用窗口可以使用哪些方法来确保新窗口正常启动?
如果您使用JavaScript打开弹出窗口,则可以使用如下所示的内容:
1 2 3 4 5 6
| var newWin = window.open(url);
if(!newWin || newWin.closed || typeof newWin.closed=='undefined')
{
//POPUP BLOCKED
} |
我尝试了上面的许多示例,但无法使它们与Chrome一起使用。这种简单的方法似乎适用于Chrome 39,Firefox 34,Safari 5.1.7和IE11。这是我们JS库中的代码段。
1 2 3 4 5 6 7 8
| 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.");
}
} |
更新:
弹出窗口存在于真正的远古时代。最初的想法是在不关闭主窗口的情况下显示其他内容。到目前为止,还有其他方法可以执行此操作:JavaScript能够发送服务器请求,因此很少使用弹出窗口。但是有时候它们仍然很方便。
过去,恶意网站经常滥用弹出式窗口。错误的页面可能会打开大量带有广告的弹出窗口。因此,现在大多数浏览器都尝试阻止弹出窗口并保护用户。
如果大多数浏览器在诸如onclick之类的用户触发的事件处理程序之外调用,则会阻止弹出窗口。
如果您考虑一下,那会有些棘手。如果代码直接位于onclick处理程序中,则很简单。但是在setTimeout中打开的弹出窗口是什么?
试试这个代码:
1 2
| // open after 3 seconds
setTimeout(() => window.open('http://google.com'), 3000); |
弹出窗口在Chrome中打开,但在Firefox中被阻止。
…这在Firefox中也适用:
1 2
| // open after 1 seconds
setTimeout(() => window.open('http://google.com'), 1000); |
区别在于,Firefox将超时时间定为2000毫秒或更短时间是可以接受的,但是在此之后,假定现在是"超出用户操作范围",则删除"信任"。因此,第一个被阻止,第二个未被阻止。
2012年最新的原始答案:
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| 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.");
}
}; |
Usage:
1 2
| var popup = window.open("http://www.google.ca", '_blank');
popupBlockerChecker.check(popup); |
希望这可以帮助! :)
无论浏览器公司或版本如何,始终可以使用的一种"解决方案"是,在屏幕上的警告信息仅出现在控件附近,该控件将弹出一个窗口,礼貌地警告用户该操作需要弹出窗口。并请为网站启用它们。
我知道这不是花哨的东西,但是它变得更简单了,只需要大约5分钟的测试,然后您就可以进行其他噩梦了。
一旦用户允许您的网站弹出式窗口,如果您不过度使用弹出式窗口,这也将是体贴的。您要做的最后一件事就是使您的访客烦恼。
我结合了@Kevin B和@DanielB的解决方案。
这要简单得多。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| var isPopupBlockerActivated = function(popupWindow) {
if (popupWindow) {
if (/chrome/.test(navigator.userAgent.toLowerCase())) {
try {
popupWindow.focus();
} catch (e) {
return true;
}
} else {
popupWindow.onload = function() {
return (popupWindow.innerHeight > 0) === false;
};
}
} else {
return true;
}
return false;
}; |
用法:
1 2 3 4
| var popup = window.open('https://www.google.com', '_blank');
if (isPopupBlockerActivated(popup)) {
// Do what you want.
} |
如果您还拥有子代码,则一种简单的方法是在其html中创建一个简单的变量,如下所示:
然后从父级检查它的存在,类似于以下内容:
1 2 3 4 5 6 7 8 9
| // Create the window with login URL.
let openedWindow = window.open(URL_HERE);
// Check this magic number after some time, if it exists then your window exists
setTimeout(() => {
if (openedWindow["magicNumber"] !== 32) {
console.error("Window open was blocked");
}
}, 1500); |
我们等待一段时间以确保网页已加载,并检查其存在。
显然,如果窗口在1500毫秒后未加载,则该变量仍为undefined。
我已经尝试了许多解决方案,但是我唯一能想到的解决方案也可以与uBlock Origin一起使用,那就是利用超时检查弹出窗口的关闭状态。
1 2 3 4 5 6 7 8 9 10 11
| 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中提供足够的时间来考虑初始的打开和关闭,因此永远不会完全准确。这将是反复试验的位置。
将此添加到您的尝试列表。
通过使用onbeforeunload事件,我们可以进行如下检查
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| function popup()
{
var chk=false;
var win1=window.open();
win1.onbeforeunload=()=>{
var win2=window.open();
win2.onbeforeunload=()=>{
chk=true;
};
win2.close();
};
win1.close();
return chk;
} |
它将在背景中打开2个黑色窗口
该函数返回布尔值。