Wie kann ich feststellen, ob ein Browser ein Popup blockiert?

Translate

Gelegentlich bin ich auf eine Webseite gestoßen, die versucht, ein neues Fenster zu öffnen (für Benutzereingaben oder etwas Wichtiges), aber der Popup-Blocker verhindert dies.

Mit welchen Methoden kann das aufrufende Fenster sicherstellen, dass das neue Fenster ordnungsgemäß gestartet wird?

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Wenn Sie das Popup mit JavaScript öffnen, können Sie Folgendes verwenden:

var newWin = window.open(url);             

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

Ich habe einige der obigen Beispiele ausprobiert, konnte sie jedoch nicht mit Chrome zum Laufen bringen. Dieser einfache Ansatz scheint mit Chrome 39, Firefox 34, Safari 5.1.7 und IE 11 zu funktionieren. Hier ist der Codeausschnitt aus unserer JS-Bibliothek.

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.");
    }
}
Quelle
Translate

Update: Popups existieren aus sehr alten Zeiten. Die ursprüngliche Idee war, einen anderen Inhalt anzuzeigen, ohne das Hauptfenster zu schließen. Ab sofort gibt es andere Möglichkeiten, dies zu tun: JavaScript kann Serveranforderungen senden, sodass Popups selten verwendet werden. Aber manchmal sind sie immer noch praktisch.

In der Vergangenheit haben böse Seiten Popups oft missbraucht. Eine schlechte Seite könnte Tonnen von Popup-Fenstern mit Anzeigen öffnen. Daher versuchen die meisten Browser jetzt, Popups zu blockieren und den Benutzer zu schützen.

Die meisten Browser blockieren Popups, wenn sie außerhalb von vom Benutzer ausgelösten Ereignishandlern wie onclick aufgerufen werden.

Wenn Sie darüber nachdenken, ist das ein bisschen schwierig. Wenn sich der Code direkt in einem Onclick-Handler befindet, ist das einfach. Aber was öffnet das Popup in setTimeout?

Versuchen Sie diesen Code:

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

Das Popup wird in Chrome geöffnet, in Firefox jedoch blockiert.

… Und das funktioniert auch in Firefox:

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

Der Unterschied besteht darin, dass Firefox behandelt, dass eine Zeitüberschreitung von 2000 ms oder weniger akzeptabel ist. Danach wird jedoch das "Vertrauen" entfernt, vorausgesetzt, es befindet sich jetzt "außerhalb der Benutzeraktion". Der erste ist also blockiert und der zweite nicht.


Ursprüngliche Antwort, die aktuell 2012 war:

Diese Lösung zur Überprüfung von Popup-Blockern wurde in FF (v11), Safari (v6), Chrome (v23.0.127.95) und IE (v7 & v9) getestet. Aktualisieren Sie die Funktion displayError, um die Fehlermeldung nach Belieben zu behandeln.

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.");
    }
};

Verwendung:

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

Hoffe das hilft! :) :)

Quelle
Translate

Eine "Lösung", die wirdimmerUnabhängig von der Firma oder Version des Browsers wird einfach eine Warnmeldung auf dem Bildschirm angezeigt, die sich in der Nähe des Steuerelements befindet und ein Popup erstellt. Sie warnt den Benutzer höflich, dass für die Aktion ein Popup erforderlich ist, und aktiviert sie bitte der Standort.

Ich weiß, es ist nichts Besonderes oder so, aber es kann nicht einfacher werden und erfordert nur etwa 5 Minuten Testzeit, dann können Sie zu anderen Albträumen übergehen.

Sobald der Benutzer Popups für Ihre Site zugelassen hat, ist es auch rücksichtsvoll, wenn Sie die Popups nicht übertreiben. Das Letzte, was Sie tun möchten, ist, Ihre Besucher zu ärgern.

Quelle
Translate

Ich habe viele Lösungen ausprobiert, aber die einzige Lösung, die ich auch mit uBlock Origin finden konnte, war die Verwendung einer Zeitüberschreitung, um den geschlossenen Status des Popups zu überprüfen.

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

Offensichtlich ist dies ein Hack; wie alle Lösungen für dieses Problem.

Sie müssen in Ihrem setTimeout genügend Zeit bereitstellen, um das anfängliche Öffnen und Schließen zu berücksichtigen, damit es niemals genau wird. Es wird eine Position des Versuchs und Irrtums sein.

Fügen Sie dies Ihrer Liste der Versuche hinzu.

Quelle
Translate

Mit dem Ereignis onbeforeunload können wir Folgendes überprüfen

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

Es werden 2 schwarze Fenster im Hintergrund geöffnet

Die Funktion gibt einen booleschen Wert zurück.

Quelle
Translate

Ich habe die Lösungen von @Kevin B und @ DanielB kombiniert.
Das ist viel einfacher.

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

Verwendung:

var popup = window.open('https://www.google.com', '_blank');
if (isPopupBlockerActivated(popup)) {
    // Do what you want.
}
Quelle