Como posso detectar se o navegador está bloqueando um pop-up?
-
08-06-2019 - |
Pergunta
Ocasionalmente, eu vim através de uma página da web que tenta pop abrir uma nova janela (para entrada do usuário, ou algo importante), mas o bloqueador de pop-up impede que isso aconteça.
Quais métodos podem chamar a janela de usar para se certificar de que a nova janela lançado corretamente?
Solução
Se você usar o JavaScript para abrir o menu de contexto, você pode usar algo como isto:
var newWin = window.open(url);
if(!newWin || newWin.closed || typeof newWin.closed=='undefined')
{
//POPUP BLOCKED
}
Outras dicas
Eu tentei uma série de exemplos acima, mas eu não podia levá-los a trabalhar com o google Chrome.Esta simples abordagem parece funcionar com o Chrome 39, Firefox 34, Safari 5.1.7, e o internet explorer 11.Aqui está o trecho de código da nossa biblioteca de JS.
openPopUp: function(urlToOpen) {
var popup_window=window.open(urlToOpen,"myWindow","toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, copyhistory=yes, width=400, height=400");
try {
popup_window.focus();
} catch (e) {
alert("Pop-up Blocker is enabled! Please add this site to your exception list.");
}
}
Atualização:Pop-ups de existir realmente os tempos antigos.A idéia inicial era mostrar outro conteúdo sem fechar a janela principal.A partir de agora, há outras maneiras de o fazer:JavaScript é capaz de enviar solicitações para o servidor, portanto, pop-ups, que são raramente usadas.Mas, às vezes, eles ainda são úteis.
No passado, o mal sites abusado popups muito.Uma má página pode abrir toneladas de janelas popup com anúncios.Então, agora a maioria dos navegadores tentam bloquear pop-ups e proteger o usuário.
A maioria dos navegadores para bloquear pop-ups, se eles são chamados fora de usuário acionou os manipuladores de eventos como onclick.
Se você pensar sobre isso, que é um pouco complicado.Se o código está diretamente em um manipulador onclick, então o que é fácil.Mas o que é o pop-up é aberta no setTimeout?
Tente este código:
// open after 3 seconds
setTimeout(() => window.open('http://google.com'), 3000);
O pop-up abre no Chrome, mas fica bloqueado no Firefox.
...E isso funciona no Firefox também:
// open after 1 seconds
setTimeout(() => window.open('http://google.com'), 1000);
A diferença é que o Firefox trata de um tempo de espera de 2000ms ou menos aceitáveis, mas depois que – remove a "confiança", partindo do princípio de que agora é "fora da ação do usuário".O primeiro é bloqueado, e o segundo é não.
Original em uma resposta que foi 2012 atual:
Esta solução para o bloqueador de pop-up de verificação foi testado no FF (v11), Safari (v6), Cromo (v23.0.127.95) & IE (v7 & v9).Atualizar o displayError função para processar a mensagem de erro como você vê o ajuste.
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 isso ajude!:)
Uma "solução" que vai sempre trabalho, independentemente do navegador da empresa ou versão é simplesmente colocar uma mensagem de aviso no ecrã, em algum lugar perto de controle que irá criar uma janela de pop-up, que, educadamente, avisa o usuário que a ação requer uma janela de pop-up e, por favor, capacitá-los para o site.
Eu sei que não é chique nem nada, mas ele não pode ficar mais simples e requer apenas cerca de 5 minutos de teste, em seguida, você pode passar para outros pesadelos.
Uma vez que o usuário tem permissão de pop-ups para o seu site, gostaria de ser atencioso se você não exagerar o bloqueador de pop-ups.A última coisa que você quer fazer é irritar seus visitantes.
Eu tentei muitas soluções, mas o único que eu poderia vir acima com a que também trabalhou com uBlock Origem, foi utilizando um tempo de espera para verificar o status fechado de pop-up.
function popup (url, width, height) {
const left = (window.screen.width / 2) - (width / 2)
const top = (window.screen.height / 2) - (height / 2)
let opener = window.open(url, '', `menubar=no, toolbar=no, status=no, resizable=yes, scrollbars=yes, width=${width},height=${height},top=${top},left=${left}`)
window.setTimeout(() => {
if (!opener || opener.closed || typeof opener.closed === 'undefined') {
console.log('Not allowed...') // Do something here.
}
}, 1000)
}
Obviamente, este é um hack;como todas as soluções para este problema.
Você precisa de fornecer tempo suficiente em seu setTimeout a conta para o processo inicial de abertura e de encerramento, por isso nunca vai ser completamente precisas.Vai ser uma posição de tentativa e erro.
Adicionar isso à sua lista de tentativas.
Utilizando o evento onbeforeunload podemos verificar como se segue
function popup()
{
var chk=false;
var win1=window.open();
win1.onbeforeunload=()=>{
var win2=window.open();
win2.onbeforeunload=()=>{
chk=true;
};
win2.close();
};
win1.close();
return chk;
}
ele vai abrir 2 janelas pretas em fundo
a função retorna o valor booleano.
Eu combinados @Kevin B e @DanielB soluções.
Isso é muito mais simples.
var isPopupBlockerActivated = function(popupWindow) {
if (popupWindow) {
if (/chrome/.test(navigator.userAgent.toLowerCase())) {
try {
popupWindow.focus();
} catch (e) {
return true;
}
} else {
popupWindow.onload = function() {
return (popupWindow.innerHeight > 0) === false;
};
}
} else {
return true;
}
return false;
};
Uso:
var popup = window.open('https://www.google.com', '_blank');
if (isPopupBlockerActivated(popup)) {
// Do what you want.
}