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?
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.
quelle
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 Websites Popups häufig 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:
Das Popup wird in Chrome geöffnet, in Firefox jedoch blockiert.
… Und das funktioniert auch in Firefox:
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:
Hoffe das hilft! :) :)
quelle
Content-Disposition: attachment;
im Antwortheader befindet), das Popup sofort geschlossen wird, dersetTimeout
Code daher fehlschlägt und der Browser sich beschwert, dass "Popup-Blocker aktiviert ist!". Für Chrome empfehle ich die Lösung von @ DanielB und sie funktioniert hervorragend.Content-Disposition: attachment;
Header öffnen, müssen Sie ihn nicht in einem Popup öffnen. Stellen Sie einfach einen direkten Link zu dem Asset her, das Sie herunterladen möchten, und das native Verhalten des Browsers ermöglicht Ihnen das Herunterladen, ohne Sie von der aktuellen Seite wegzuleiten.window.location
ihn verwende, wird das Generieren der ersten Datei beim Starten der zweiten Anforderung ignoriert. Das ist der Grund, warum ich verwenden musswindow.open
, dawindow.location
ich nie weiß, wann die Antwort beendet ist.Eine "Lösung", die unabhängig von der Browser-Firma oder -Version immer funktioniert, besteht darin, einfach eine Warnmeldung auf dem Bildschirm zu platzieren, die sich in der Nähe des Steuerelements befindet und ein Popup erstellt, das den Benutzer höflich warnt, dass für die Aktion ein Popup erforderlich ist. bis und bitte aktivieren Sie sie für die Website.
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
Ich habe die Lösungen von @Kevin B und @ DanielB kombiniert.
Das ist viel einfacher.
Verwendung:
quelle
isPopupBlockerActivated
Funktion kehrt nie zurückreturn (popupWindow.innerHeight > 0) === false;
. Ihre Funktion gibt false zurück, wenn Ihr Browser nicht Chrome ist. Weil Onload ein asynchroner Prozess ist. Ihre Funktion gibt false zurück und dann wird onload ausgeführt, aber das Ergebnis wird nie zurückgegeben.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.
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
Ein einfacher Ansatz, wenn Sie auch den untergeordneten Code besitzen , besteht darin, eine einfache Variable in ihrem HTML wie folgt zu erstellen:
Und dann überprüfen Sie seine Existenz vom Elternteil etwas Ähnliches wie das Folgende:
Wir warten einige Zeit, um sicherzustellen, dass die Webseite geladen wurde, und überprüfen ihre Existenz. Wenn das Fenster nach 1500 ms nicht geladen würde, wäre die Variable natürlich immer noch
undefined
.quelle
Mit dem Ereignis onbeforeunload können wir Folgendes überprüfen
Es werden 2 schwarze Fenster im Hintergrund geöffnet
Die Funktion gibt einen booleschen Wert zurück.
quelle