Aktualizacja: Popupy istnieją od naprawdę starożytnych czasów. Początkowym pomysłem było pokazanie innej treści bez zamykania głównego okna. Obecnie istnieją inne sposoby, aby to zrobić: JavaScript może wysyłać żądania do serwera, więc wyskakujące okienka są rzadko używane. Ale czasami są nadal przydatne.
W przeszłości złe strony często nadużywały wyskakujących okienek. Zła strona może otwierać mnóstwo wyskakujących okienek z reklamami. Dlatego teraz większość przeglądarek próbuje blokować wyskakujące okienka i chronić użytkownika.
Większość przeglądarek blokuje wyskakujące okienka, jeśli są wywoływane poza programami obsługi zdarzeń wyzwalanymi przez użytkownika, takimi jak onclick.
Jeśli się nad tym zastanowić, to trochę skomplikowane. Jeśli kod znajduje się bezpośrednio w module obsługi onclick, to jest to łatwe. Ale co otwiera wyskakujące okienko w setTimeout?
Wypróbuj ten kod:
// open after 3 seconds
setTimeout(() => window.open('http://google.com'), 3000);
Wyskakujące okienko otwiera się w przeglądarce Chrome, ale jest blokowane w przeglądarce Firefox.
… Działa to również w Firefoksie:
// open after 1 seconds
setTimeout(() => window.open('http://google.com'), 1000);
Różnica polega na tym, że Firefox traktuje limit czasu 2000 ms lub mniejszy jest akceptowalny, ale po nim - usuwa „zaufanie”, zakładając, że teraz jest ono „poza akcją użytkownika”. Więc pierwszy jest zablokowany, a drugi nie.
Oryginalna odpowiedź, aktualna w 2012 roku:
To rozwiązanie do sprawdzania blokowania wyskakujących okienek zostało przetestowane w FF (v11), Safari (v6), Chrome (v23.0.127.95) i IE (v7 i v9). Zaktualizuj funkcję displayError, aby obsłużyć komunikat o błędzie według własnego uznania.
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.");
}
};
Stosowanie:
var popup = window.open("http://www.google.ca", '_blank');
popupBlockerChecker.check(popup);
Mam nadzieję że to pomoże! :)