Оновлення: спливаючі вікна існують з дуже давніх часів. Початковою ідеєю було показати інший контент, не закриваючи головне вікно. На сьогоднішній день існують інші способи зробити це: JavaScript може надсилати запити на сервер, тому спливаючі вікна використовуються рідко. Але іноді вони все-таки зручні.
У минулому злі місця зловживань з'являлися багато. Погана сторінка може відкрити багато спливаючих вікон з рекламою. Тож тепер більшість браузерів намагаються блокувати спливаючі вікна та захищати користувача.
Більшість браузерів блокує спливаючі вікна, якщо вони викликаються поза оброблюваними користувачами подій, як-от onclick.
Якщо ви задумаєтесь, це трохи хитро. Якщо код знаходиться безпосередньо в обробці onclick, це легко. Але що відкриває спливаюче вікно у setTimeout?
Спробуйте цей код:
// open after 3 seconds
setTimeout(() => window.open('http://google.com'), 3000);
Спливаюче вікно відкривається в Chrome, але блокується у Firefox.
… І це працює і в Firefox:
// open after 1 seconds
setTimeout(() => window.open('http://google.com'), 1000);
Різниця полягає в тому, що Firefox обробляє час очікування в 2000 мс або менше, але після цього - видаляє "довіру", припускаючи, що зараз це "поза діями користувача". Тож перший заблокований, а другий - ні.
Оригінальна відповідь, яка була поточною у 2012 році:
Це рішення для перевірки блокаторів спливаючих вікон було протестовано у FF (v11), Safari (v6), Chrome (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.");
}
};
Використання:
var popup = window.open("http://www.google.ca", '_blank');
popupBlockerChecker.check(popup);
Сподіваюся, це допомагає! :)