Actualización: las ventanas emergentes existen desde tiempos muy antiguos. La idea inicial era mostrar otro contenido sin cerrar la ventana principal. A partir de ahora, hay otras formas de hacerlo: JavaScript puede enviar solicitudes de servidor, por lo que rara vez se utilizan ventanas emergentes. Pero a veces todavía son útiles.
En el pasado, los sitios malvados abusaron mucho de las ventanas emergentes. Una página incorrecta podría abrir toneladas de ventanas emergentes con anuncios. Entonces, la mayoría de los navegadores intentan bloquear las ventanas emergentes y proteger al usuario.
La mayoría de los navegadores bloquean las ventanas emergentes si se llaman fuera de los controladores de eventos activados por el usuario, como onclick.
Si lo piensas, es un poco complicado. Si el código está directamente en un controlador onclick, entonces eso es fácil. Pero, ¿cuál es la ventana emergente que se abre en setTimeout?
Prueba este código:
// open after 3 seconds
setTimeout(() => window.open('http://google.com'), 3000);
La ventana emergente se abre en Chrome, pero se bloquea en Firefox.
... Y esto también funciona en Firefox:
// open after 1 seconds
setTimeout(() => window.open('http://google.com'), 1000);
La diferencia es que Firefox trata un tiempo de espera de 2000 ms o menos aceptable, pero después de eso, elimina la "confianza", suponiendo que ahora está "fuera de la acción del usuario". Entonces el primero está bloqueado y el segundo no.
Respuesta original que era actual 2012:
Esta solución para la comprobación del bloqueador de elementos emergentes se ha probado en FF (v11), Safari (v6), Chrome (v23.0.127.95) e IE (v7 y v9). Actualice la función displayError para manejar el mensaje de error como mejor le parezca.
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);
¡Espero que esto ayude! :)