Aggiornamento: i popup esistono da tempi molto antichi. L'idea iniziale era quella di mostrare un altro contenuto senza chiudere la finestra principale. A partire da ora, ci sono altri modi per farlo: JavaScript è in grado di inviare richieste per server, quindi i popup vengono usati raramente. Ma a volte sono ancora utili.
In passato i siti malvagi abusavano molto dei popup. Una cattiva pagina potrebbe aprire tonnellate di finestre popup con annunci. Quindi ora la maggior parte dei browser tenta di bloccare i popup e proteggere l'utente.
La maggior parte dei browser blocca i popup se vengono chiamati all'esterno di gestori di eventi attivati dall'utente come onclick.
Se ci pensi, è un po 'complicato. Se il codice è direttamente in un gestore onclick, allora è facile. Ma cos'è il popup aperto in setTimeout?
Prova questo codice:
// open after 3 seconds
setTimeout(() => window.open('http://google.com'), 3000);
Il popup si apre in Chrome, ma viene bloccato in Firefox.
... E questo funziona anche in Firefox:
// open after 1 seconds
setTimeout(() => window.open('http://google.com'), 1000);
La differenza è che Firefox considera accettabile un timeout di 2000ms o meno, ma dopo ciò - rimuove la "fiducia", supponendo che ora sia "al di fuori dell'azione dell'utente". Quindi il primo è bloccato e il secondo no.
Risposta originale che era attuale 2012:
Questa soluzione per il controllo dei blocchi popup è stata testata in FF (v11), Safari (v6), Chrome (v23.0.127.95) e IE (v7 e v9). Aggiorna la funzione displayError per gestire il messaggio di errore come ritieni opportuno.
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.");
}
};
Uso:
var popup = window.open("http://www.google.ca", '_blank');
popupBlockerChecker.check(popup);
Spero che questo ti aiuti! :)