Обновление: всплывающие окна существуют с очень древних времен. Первоначальная идея заключалась в том, чтобы показать другой контент, не закрывая главное окно. На данный момент есть и другие способы сделать это: 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);
Надеюсь это поможет! :)