Atualização: Os pop-ups existem desde os tempos realmente antigos. A ideia inicial era mostrar outro conteúdo sem fechar a janela principal. A partir de agora, existem outras maneiras de fazer isso: o JavaScript pode enviar solicitações de servidor, portanto os pop-ups raramente são usados. Mas às vezes eles ainda são úteis.
No passado, sites malignos abusavam muito de pop-ups. Uma página ruim pode abrir toneladas de janelas pop-up com anúncios. Portanto, agora a maioria dos navegadores tenta bloquear pop-ups e proteger o usuário.
A maioria dos navegadores bloqueia pop-ups se forem chamados fora dos manipuladores de eventos acionados pelo usuário, como o onclick.
Se você pensar bem, isso é um pouco complicado. Se o código estiver diretamente em um manipulador onclick, é fácil. Mas qual é o pop-up aberto no setTimeout?
Tente este código:
// open after 3 seconds
setTimeout(() => window.open('http://google.com'), 3000);
O pop-up é aberto no Chrome, mas é bloqueado no Firefox.
… E isso também funciona no Firefox:
// open after 1 seconds
setTimeout(() => window.open('http://google.com'), 1000);
A diferença é que o Firefox trata um tempo limite de 2000ms ou menos são aceitáveis, mas depois disso - remove a "confiança", assumindo que agora está "fora da ação do usuário". Então o primeiro está bloqueado e o segundo não.
Resposta original atual em 2012:
Esta solução para verificação de bloqueadores de pop-up foi testada no FF (v11), Safari (v6), Chrome (v23.0.127.95) e IE (v7 e v9). Atualize a função displayError para manipular a mensagem de erro como desejar.
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 isto ajude! :)