Domanda

Di tanto in tanto mi sono imbattuto in una pagina 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 metodi possono chiamante finestra per assicurarsi che la nuova finestra lanciato correttamente?

È stato utile?

Soluzione

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

var newWin = window.open(url);             

if(!newWin || newWin.closed || typeof newWin.closed=='undefined') 
{ 
    //POPUP BLOCKED
}

Altri suggerimenti

Ho provato un certo numero di esempi di cui sopra, ma non sono riuscito a farli funzionare 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 libreria 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.");
    }
}

Aggiornamento:Popup esiste da tempi antichi.L'idea iniziale era di mostrare un contenuto senza chiudere la finestra principale.Ora come ora, ci sono altri modi per farlo:JavaScript è in grado di inviare le richieste per il server, in modo che i popup sono raramente utilizzati.Ma a volte sono ancora a portata di mano.

In passato il male, siti abusato popup un sacco.Una brutta pagina potrebbe aprire tonnellate di pop-up di windows con ads.Così ora la maggior parte dei browser tenta di bloccare i popup e proteggere l'utente.

La maggior parte dei browser bloccare i popup se essi sono chiamati fuori di utente attivato gestori di eventi come onclick.

Se ci pensate, è un po ' complicato.Se il codice è direttamente in un onclick di un handler che facile.Ma qual è il popup si apre in setTimeout?

Prova questo codice:

 // open after 3 seconds
setTimeout(() => window.open('http://google.com'), 3000);

Il popup si apre in Chrome, ma viene bloccato in Firefox.

...E questo funziona anche Firefox:

 // open after 1 seconds
setTimeout(() => window.open('http://google.com'), 1000);

La differenza è che Firefox tratta di un timeout di 2000ms o meno sono accettabili, ma dopo si rimuove la “fiducia”, supponendo che ora è “al di fuori dell'azione da parte dell'utente”.La prima è bloccato, e il secondo non è.


Originale risposta in corrente 2012:

Questa soluzione per il blocco dei popup di controllo è stato testato in FF (v11), Safari (v6), Chrome (v23.0.127.95) & IE (v7 & v9).Aggiornare il displayError funzione 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.");
    }
};

Utilizzo:

var popup = window.open("http://www.google.ca", '_blank');
popupBlockerChecker.check(popup);

Spero che questo aiuta!:)

Una "soluzione" che sempre lavoro a prescindere dal browser azienda o la versione è semplicemente di mettere un messaggio di avviso sullo schermo, da qualche parte vicino al controllo che permetterà di creare un pop-up, che gentilmente avverte l'utente che l'azione richiede un pop-up e, per favore, attivate per il sito.

So che non è fantasia o cosa, ma non si può ottenere qualsiasi più semplice e richiede solo circa 5 minuti di test, quindi si può passare ad altri incubi.

Una volta che l'utente ha permesso di pop-up per il vostro sito, potrebbe anche essere rispettoso, se non esagerate con i pop-up.L'ultima cosa che vuoi fare è infastidire i visitatori.

Ho provato un sacco di soluzioni, ma l'unica che mi potesse venire in mente che anche lavorato con uBlock Origine, è stato utilizzando un timeout per controllare stato chiuso il 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)
}

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

È necessario fornire abbastanza tempo nella vostra setTimeout per conto iniziale di apertura e di chiusura, in modo che non sta per essere completamente accurata.Sarà una posizione di prova ed errore.

Aggiungi questo alla tua lista di tentativi.

Utilizzando evento onbeforeunload 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 nero windows in background

la funzione restituisce il valore booleano.

Ho combinato @Kevin B e @DanielB soluzioni.
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;
};

Utilizzo:

var popup = window.open('https://www.google.com', '_blank');
if (isPopupBlockerActivated(popup)) {
    // Do what you want.
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top