Como posso detectar se um navegador está bloqueando um pop-up?

votos
88

Ocasionalmente, eu me deparei com uma página que tenta pop abrir uma nova janela (para a entrada do usuário, ou algo importante), mas o bloqueador de pop-up impede que isso aconteça.

Que métodos podem a janela chamando usar para garantir que a nova janela lançado corretamente?

Publicado 05/08/2008 em 23:01
fonte usuário
Em outras línguas...                            


6 respostas

votos
109

Se você usar JavaScript para abrir o pop-up, você pode usar algo como isto:

var newWin = window.open(url);             

if(!newWin || newWin.closed || typeof newWin.closed=='undefined') 
{ 
    //POPUP BLOCKED
}
Respondeu 05/08/2008 em 23:03
fonte usuário

votos
30

Eu tentei uma série de exemplos acima, mas eu não podia levá-los a trabalhar com o Chrome. Esta abordagem simples parece funcionar com o Chrome 39, Firefox 34, Safari 5.1.7 e IE 11. Aqui está o trecho de código da nossa biblioteca 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.");
    }
}
Respondeu 31/12/2014 em 19:16
fonte usuário

votos
24

Esta solução para a verificação de popup bloqueador foi testado em FF (v11), Safari (v6), Chrome (v23.0.127.95) & IE (v7 & v9). Atualizar a função _displayError para lidar com 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 isto ajude! :)

Respondeu 30/11/2012 em 21:39
fonte usuário

votos
10

Uma "solução" que vai sempre trabalhar independentemente da empresa navegador ou versão é simplesmente colocar uma mensagem de aviso na tela, em algum lugar perto do controle que irá criar um pop-up, que educadamente avisa o usuário que a ação exige um pop- -se e agradar a capacitá-los para o site.

Eu sei que não é fantasia ou qualquer coisa, mas não pode ser mais simples e requer apenas o teste cerca de 5 minutos, então você pode passar para outros pesadelos.

Uma vez que o usuário permitiu pop-ups para o seu site, ele também iria ser atencioso se você não exagere os pop-ups. A última coisa que você quer fazer é irritar seus visitantes.

Respondeu 26/02/2016 em 22:49
fonte usuário

votos
0

Usando onbeforeunload evento 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 valor booleano.

Respondeu 29/05/2018 em 14:56
fonte usuário

votos
0

Eu tentei muitas soluções, mas o único que eu poderia vir acima com que também trabalhou com uBlock Origin, foi utilizando um tempo limite para verificar o estado fechado do popup.

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 dar tempo suficiente em sua setTimeout para dar conta da abertura inicial e de encerramento, por isso nunca vai ser completamente preciso. Vai ser uma posição de tentativa e erro.

Adicione isto a sua lista de tentativas.

Respondeu 30/01/2018 em 12:29
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more