Mise à jour : Les fenêtres pop-up existent depuis des temps très anciens. L'idée initiale était de montrer un autre contenu sans fermer la fenêtre principale. A partir de maintenant, il existe d'autres moyens de le faire : JavaScript est capable d'envoyer des requêtes au serveur, donc les popups sont rarement utilisées. Mais parfois, elles sont toujours pratiques.
Dans le passé, les sites malveillants abusaient beaucoup des popups. Une mauvaise page pouvait ouvrir des tonnes de fenêtres pop-up avec des publicités. Aujourd'hui, la plupart des navigateurs essaient de bloquer les popups et de protéger l'utilisateur.
La plupart des navigateurs bloquent les fenêtres pop-up si elles sont appelées en dehors des gestionnaires d'événements déclenchés par l'utilisateur, comme onclick.
Si vous y réfléchissez, c'est un peu délicat. Si le code se trouve directement dans un gestionnaire onclick, alors c'est facile. Mais que se passe-t-il si la popup s'ouvre dans setTimeout ?
Essayez ce code :
// open after 3 seconds
setTimeout(() => window.open('http://google.com'), 3000);
La fenêtre contextuelle s'ouvre dans Chrome, mais est bloquée dans Firefox.
Et cela fonctionne aussi dans Firefox :
// open after 1 seconds
setTimeout(() => window.open('http://google.com'), 1000);
La différence est que Firefox considère qu'un délai de 2000 ms ou moins est acceptable, mais qu'après cela, il supprime la "confiance", en supposant qu'il est maintenant "en dehors de l'action de l'utilisateur". Ainsi, le premier est bloqué, et le second ne l'est pas.
Réponse originale qui était actuelle 2012 :
Cette solution pour la vérification des bloqueurs de fenêtres pop-up a été testée dans FF (v11), Safari (v6), Chrome (v23.0.127.95) et IE (v7 & v9). Mettez à jour l'option displayError pour gérer le message d'erreur comme vous le souhaitez.
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.");
}
};
Utilisation :
var popup = window.open("http://www.google.ca", '_blank');
popupBlockerChecker.check(popup);
J'espère que cela vous aidera ! :)