Mise à jour: les pop-ups existent depuis des temps très anciens. L'idée initiale était d'afficher un autre contenu sans fermer la fenêtre principale. À partir de maintenant, il existe d'autres moyens de le faire: JavaScript est capable d'envoyer des requêtes pour le serveur, les popups sont donc rarement utilisés. Mais parfois, ils sont toujours utiles.
Dans le passé, les sites malveillants ont beaucoup abusé des popups. Une mauvaise page pourrait ouvrir des tonnes de fenêtres contextuelles avec des publicités. Alors maintenant, la plupart des navigateurs essaient de bloquer les popups et de protéger l'utilisateur.
La plupart des navigateurs bloquent les fenêtres contextuelles 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 est directement dans un gestionnaire onclick, c'est facile. Mais qu'est-ce que le 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 traite un délai d'expiration de 2000 ms ou moins est acceptable, mais après cela - supprime la «confiance», en supposant que maintenant c'est «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 en cours en 2012:
Cette solution de vérification du bloqueur de popup a été testée dans FF (v11), Safari (v6), Chrome (v23.0.127.95) et IE (v7 & v9). Mettez à jour la fonction displayError pour gérer le message d'erreur comme bon vous semble.
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.");
}
};
Usage:
var popup = window.open("http://www.google.ca", '_blank');
popupBlockerChecker.check(popup);
J'espère que cela t'aides! :)