Come posso rilevare se un browser sta bloccando un popup?

voti
88

Di tanto in tanto, ho incontrato una pagina web che cerca di pop aprire una nuova finestra (per l'input dell'utente, o qualcosa di importante), ma il blocco popup impedisce che ciò accada.

Quali sono i metodi può utilizzare la finestra di chiamare per assicurarsi che la nuova finestra lanciato correttamente?

È pubblicato 05/08/2008 alle 23:01
fonte dall'utente
In altre lingue...                            


7 risposte

voti
109

Se si utilizza JavaScript per aprire il pop-up, è possibile utilizzare qualcosa di simile a questo:

var newWin = window.open(url);             

if(!newWin || newWin.closed || typeof newWin.closed=='undefined') 
{ 
    //POPUP BLOCKED
}
Risposto il 05/08/2008 a 23:03
fonte dall'utente

voti
24

Questa soluzione per il controllo del blocco dei popup è stato testato in FF (V11), Safari (V6), Chrome (v23.0.127.95) e IE (v7 e v9). Aggiornare la funzione _displayError per gestire il messaggio di errore, come si vede in forma.

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);

Spero che questo ti aiuti! :)

Risposto il 30/11/2012 a 21:39
fonte dall'utente

voti
30

Ho provato un certo numero di esempi di cui sopra, ma non ho potuto ottenere loro di lavorare con Chrome. Questo semplice approccio sembra funzionare con Chrome 39, Firefox 34, Safari 5.1.7, e IE 11. Ecco il frammento di codice dalla nostra 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.");
    }
}
Risposto il 31/12/2014 a 19:16
fonte dall'utente

voti
10

Una "soluzione" che sempre funzionerà indipendentemente dalla società browser o la versione è quello di mettere semplicemente un messaggio di avviso sullo schermo, da qualche parte vicino al controllo che creerà un pop-up, che avvisa l'utente educatamente che l'azione richiede un pop- e per far loro piacere abilitare per il sito.

Io so che non è fantasia o altro, ma non riesco a ottenere qualsiasi più semplice e richiede solo il test di circa 5 minuti, allora si può passare ad altri incubi.

Una volta che l'utente ha consentito pop-up per il vostro sito, sarebbe anche premuroso se non esagerare con i pop-up. L'ultima cosa che vuoi fare è infastidire i visitatori.

Risposto il 26/02/2016 a 22:49
fonte dall'utente

voti
0

Ho provato un sacco di soluzioni, ma l'unico che ho potuto venire con che ha anche lavorato con uBlock Origin, ero utilizzando un timeout per controllare lo stato chiuso del 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)
}

Ovviamente questo è un hack; come tutte le soluzioni a questo problema.

È necessario fornire abbastanza tempo nel vostro setTimeout per tenere conto per l'apertura e la chiusura iniziale, quindi non è mai intenzione di essere accuratamente accurate. Sarà una posizione di tentativi ed errori.

Aggiungi questo alla tua lista di tentativi.

Risposto il 30/01/2018 a 12:29
fonte dall'utente

voti
0

Utilizzando onbeforeunload evento possiamo controllare come 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;
    }

si aprirà 2 finestre nere in background

la funzione restituisce valore booleano.

Risposto il 29/05/2018 a 14:56
fonte dall'utente

voti
0

Ho combinato @ Kevin B e @ soluzioni danielb.
Questo è molto più semplice.

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.
}
Risposto il 27/02/2019 a 05:53
fonte dall'utente

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