Mir sind Javascript-Techniken bekannt, mit denen festgestellt werden kann, ob ein Popup in anderen Browsern blockiert ist (wie in der Antwort auf diese Frage beschrieben ). Hier ist der grundlegende Test:
var newWin = window.open(url);
if(!newWin || newWin.closed || typeof newWin.closed=='undefined')
{
//POPUP BLOCKED
}
Dies funktioniert jedoch nicht in Chrome. Der Abschnitt "POPUP BLOCKED" wird nie erreicht, wenn das Popup blockiert ist.
Natürlich funktioniert der Test in gewissem Umfang, da Chrome das Popup nicht blockiert, sondern es in einem winzigen minimierten Fenster in der unteren rechten Ecke öffnet, in dem "blockierte" Popups aufgelistet sind.
Ich möchte feststellen können, ob das Popup durch den Popup-Blocker von Chrome blockiert wurde. Ich versuche, das Schnüffeln des Browsers zugunsten der Funktionserkennung zu vermeiden. Gibt es eine Möglichkeit, dies ohne Browser-Schnüffeln zu tun?
Bearbeiten : Ich habe nun versucht , Gebrauch gemacht wird von newWin.outerHeight
, newWin.left
und anderen ähnlichen Eigenschaften , dies zu erreichen. Google Chrome gibt alle Positions- und Höhenwerte als 0 zurück, wenn das Popup blockiert ist.
Leider werden auch dann dieselben Werte zurückgegeben, wenn das Popup tatsächlich für eine unbekannte Zeitspanne geöffnet ist. Nach einer magischen Zeit (einige Sekunden in meinen Tests) werden die Standort- und Größeninformationen als die richtigen Werte zurückgegeben. Mit anderen Worten, ich bin immer noch nicht näher dran, dies herauszufinden. Jede Hilfe wäre dankbar.
quelle
Antworten:
Nun, die "magische Zeit", von der Sie sprechen, ist wahrscheinlich, wenn das DOM des Popups geladen wurde. Oder es kann sein, dass alles (Bilder, Außenborder-CSS usw.) geladen wurde. Sie können dies einfach testen, indem Sie dem Popup eine sehr große Grafik hinzufügen (löschen Sie zuerst Ihren Cache!). Wenn Sie ein Javascript-Framework wie jQuery (oder ähnliches) verwenden, können Sie mit dem Ereignis ready () (oder ähnlichem) warten, bis das DOM geladen ist, bevor Sie den Fensterversatz überprüfen. Die Gefahr besteht darin, dass die Safari-Erkennung auf widersprüchliche Weise funktioniert: Das DOM des Popups ist in Safari niemals bereit (), da es Ihnen ein gültiges Handle für das Fenster gibt, das Sie öffnen möchten - unabhängig davon, ob es tatsächlich geöffnet wird oder nicht nicht. (Tatsächlich glaube ich, dass Ihr Popup-Testcode oben für Safari nicht funktioniert.)
Ich denke, das Beste, was Sie tun können, ist, Ihren Test in ein setTimeout () zu packen und dem Popup 3-5 Sekunden Zeit zu geben, um das Laden abzuschließen, bevor Sie den Test ausführen. Es ist nicht perfekt, aber es sollte mindestens 95% der Zeit funktionieren.
Hier ist der Code, den ich für die browserübergreifende Erkennung ohne den Chrome-Teil verwende.
Ich führe diesen Test vom übergeordneten Element aus aus und verpacke ihn in ein setTimeout (), sodass das untergeordnete Fenster 3-5 Sekunden zum Laden benötigt. Im untergeordneten Fenster müssen Sie eine Testfunktion hinzufügen:
Funktionstest() {}
Der Popup-Blocker-Detektor prüft, ob die Funktion "Test" als Mitglied des untergeordneten Fensters vorhanden ist.
HINZUGEFÜGT 15. JUNI 2015:
Ich denke, die moderne Art, damit umzugehen, wäre die Verwendung von window.postMessage (), damit das Kind das Elternteil benachrichtigt, dass das Fenster geladen wurde. Der Ansatz ist ähnlich (Kind teilt Eltern mit, dass es geladen ist), aber die Kommunikationsmittel haben sich verbessert. Ich konnte diese domänenübergreifende Funktion vom Kind aus ausführen:
Der Elternteil hört auf diese Nachricht mit:
Hoffe das hilft.
quelle
Nur eine Verbesserung des InvisibleBacon-Snipets (getestet in IE9, Safari 5, Chrome 9 und FF 3.6):
quelle
Das Folgende ist a jQuery- Lösung zur Überprüfung von Popup-Blockern. Es 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.
Verwendung:
Hoffe das hilft! :) :)
quelle
Richs Antwort wird für Chrome nicht mehr funktionieren. Es sieht so aus, als würde Chrome jetzt tatsächlich Javascript im Popup-Fenster ausführen. Am Ende habe ich nach einem screenX-Wert von 0 gesucht, um nach blockierten Popups zu suchen. Ich denke auch, dass ich einen Weg gefunden habe, um sicherzustellen, dass diese Eigenschaft endgültig ist, bevor ich sie überprüfe. Dies funktioniert nur für Popups in Ihrer Domain. Sie können jedoch einen Onload-Handler wie den folgenden hinzufügen:
Wie viele berichtet haben, meldet die Eigenschaft "screenX" manchmal Nicht-Null für fehlgeschlagene Popups, selbst nach dem Laden. Ich habe dieses Verhalten ebenfalls erlebt, aber wenn Sie die Prüfung nach einem Timeout von null ms hinzufügen, scheint die Eigenschaft screenX immer einen konsistenten Wert auszugeben.
Lassen Sie mich wissen, ob es Möglichkeiten gibt, dieses Skript robuster zu machen. Scheint aber für meine Zwecke zu arbeiten.
quelle
onload
feuert nie.Das hat bei mir funktioniert:
OuterHeight und OuterWidth sind für Chrom, da der Trick 'about: blank' von oben in Chrom nicht mehr funktioniert.
quelle
Ich werde einfach die hier bereitgestellte Antwort kopieren / einfügen: https://stackoverflow.com/a/27725432/892099 von DanielB. funktioniert auf Chrom 40 und es ist sehr sauber. Keine schmutzigen Hacks oder Wartezeiten.
quelle
Wie wäre es mit einem
Promise
Ansatz?Und Sie können es wie den Klassiker verwenden
window.open
Sie könnten den Code so ändern, dass er das Versprechen nicht einhält, anstatt zurückzukehren
undefined
. Ich dachte nur, dass diesif
ein einfacherer Kontrollfluss ist alstry / catch
in diesem Fall.quelle
Überprüfen Sie die Position des Fensters relativ zum übergeordneten Fenster. Chrome lässt das Fenster fast außerhalb des Bildschirms erscheinen.
quelle
Ich hatte ein ähnliches Problem mit Popups, die nicht in Chrome geöffnet wurden. Ich war frustriert, weil ich nicht versuchte, etwas hinterhältiges zu tun, wie ein Onload-Popup, sondern nur ein Fenster öffnete, wenn der Benutzer darauf klickte. Ich war doppelt frustriert, weil das Ausführen meiner Funktion, die window.open () über die Firebug-Befehlszeile enthielt, funktionierte, während das Klicken auf meinen Link nicht funktionierte! Hier war meine Lösung:
Falscher Weg: Ausführen von window.open () über einen Ereignis-Listener (in meinem Fall dojo.connect mit der Onclick-Ereignismethode eines DOM-Knotens).
Richtiger Weg: Zuweisen einer Funktion zur onclick-Eigenschaft des Knotens, der window.open () aufgerufen hat.
Und natürlich kann ich bei Bedarf immer noch Ereignis-Listener für dasselbe Onclick-Ereignis erstellen. Mit dieser Änderung konnte ich meine Fenster öffnen, obwohl Chrome auf "Keine Website darf Popups anzeigen" eingestellt war. Freude.
Wenn jemand, der mit Chrome vertraut ist, dem Rest von uns sagen kann, warum es einen Unterschied macht, würde ich es gerne hören, obwohl ich vermute, dass es nur ein Versuch ist, böswilligen programmatischen Popups die Tür zu schließen.
quelle
Hier ist eine Version, die derzeit in Chrome funktioniert. Nur eine kleine Änderung von Richs Lösung entfernt, obwohl ich einen Wrapper hinzugefügt habe, der auch das Timing regelt.
Um es zu benutzen, gehen Sie einfach so vor:
Wenn das Popup blockiert wird, wird die Warnmeldung nach Ablauf der Nachfrist von 5 Sekunden angezeigt (Sie können dies anpassen, aber 5 Sekunden sollten ziemlich sicher sein).
quelle
Dieses Fragment enthält alle oben genannten Elemente. Aus irgendeinem Grund schließt StackOverflow die erste und die letzte Codezeile im folgenden Codeblock aus. Deshalb habe ich einen Blog darüber geschrieben. Eine vollständige Erklärung und den Rest des (herunterladbaren) Codes finden Sie in meinem Blog unter thecodeabode.blogspot.com
quelle
Wow, hier gibt es sicher viele Lösungen. Dies ist meine, es verwendet Lösungen aus der aktuell akzeptierten Antwort (die in der neuesten Version von Chrome nicht funktioniert und das Einschließen einer Zeitüberschreitung erfordert) sowie eine verwandte Lösung für diesen Thread (die eigentlich Vanilla JS ist, nicht jQuery). .
Meins verwendet eine Rückrufarchitektur, die gesendet wird,
true
wenn das Popup blockiert wird undfalse
ansonsten.quelle
Jasons Antwort ist die einzige Methode, an die ich auch denken kann, aber sich auf eine solche Position zu verlassen, ist ein bisschen zwielichtig!
Heutzutage müssen Sie die Frage "Wurde mein unerwünschtes Popup blockiert?" Nicht wirklich stellen, da die Antwort immer "Ja" lautet. In allen gängigen Browsern ist der Popupblocker standardmäßig aktiviert. Der beste Ansatz ist immer nur window.open () als Reaktion auf einen direkten Klick, der fast immer zulässig ist.
quelle
HALLO
Ich habe die oben beschriebenen Lösungen leicht modifiziert und denke, dass sie zumindest für Chrome funktionieren. Meine Lösung besteht darin, zu erkennen, ob das Popup beim Öffnen der Hauptseite blockiert ist, nicht beim Öffnen des Popups, aber ich bin sicher, dass es einige Leute gibt, die es ändern können. :-) Der Nachteil hier ist, dass das Popup-Fenster angezeigt wird für ein paar Sekunden (möglicherweise etwas verkürzbar), wenn kein Popup-Blocker vorhanden ist.
Ich habe dies in den Bereich meines Hauptfensters eingefügt
Der Popuptest sieht so aus:
Da ich nach 3500 ms die Testfunktion auf der Popup-Seite aufrufe, wurde die Innenhöhe von Chrome korrekt eingestellt.
Ich benutze die Variable popUpsBlocked, um zu wissen, ob die Popups in anderen Javascripts angezeigt werden oder nicht. dh
quelle
quelle
Soweit ich das beurteilen kann (nach dem, was ich getestet habe), gibt Chrome ein Fensterobjekt mit der Position "about: blank" zurück. Folgendes sollte also für alle Browser funktionieren:
quelle