Als ich kürzlich an einem Projekt arbeitete, stieß ich auf eine Situation, in der die Verwendung von window.open vom Browser abgefangen wurde, was die Leute extrem deprimiert machte. Obwohl die Seite in ihrer eigenen Umgebung freigegeben werden kann, ist dies für Benutzer nicht möglich erforderlich, um das Abfangen zu bestehen. Darüber hinaus haben viele Anfänger keine Ahnung, was vor sich geht, und wissen nicht, wo sie sich die abgefangene Seite ansehen sollen. Das ist wirklich traurig.
Darüber hinaus kann festgestellt werden, dass window.open, wenn es ein Ereignis für den Benutzer auslöst oder geladen wird, nicht abgefangen wird. Sobald der Popup-Code in Ajax oder einen asynchronen Code verschoben wird, wird er sofort abgefangen .
Ursachenanalyse & fundierte RechercheWenn der Browser ein neues Popup-Fenster erkennt, das durch Nichtbenutzervorgänge generiert wird, blockiert er es. Weil der Browser denkt, dass dies keine Seite ist, die der Benutzer sehen möchte.
Bei direkter Ausführung in js ergibt sich beispielsweise der folgende Code:
js-Code:
//Eine Seite direkt öffnen window.open('//www.baidu.com', '_blank');
Browser IE8 Chrome 40 Firefox 34 Opera 27 Safari 5.1.7
Ob das Auftauchen von NNYYY verhindert werden soll und für den folgenden Code:
js-Code:
document.body.addEventListener('click', function() { window.open('//www.baidu.com', '_blank'); });
Alle Browser blockieren es nicht.
Zusammenfassend lässt sich sagen, dass jeder Browser den Zeitpunkt des Abfangens unterschiedlich beurteilt und die Reaktion auf den im Ajax-Rückruf platzierten Code unterschiedlich ist, sodass ich hier nicht auf Details eingehen werde. Es ist jedoch nicht das, was Programmierer wollen, wenn das Popup-Fenster in unserem Code vom Browser abgefangen wird.
Lösung:1. Verwenden Sie stattdessen ein Tag
Angesichts der folgenden Funktion kann durch die Bindung dieser Funktion an den Rückruf des Klickereignisses das Abfangen von Fenster-Popups durch die meisten Browser vermieden werden:
js-Code:
function newWin(url, id) { var a = document.createElement('a'); a.setAttribute('href', url'); ', id); // Wiederholtes Hinzufügen verhindern if(!document.getElementById(id)) document.body.appendChild(a.click();}
2. Verwenden Sie die Submit-Methode des Formulars, um eine Seite zu öffnen
Diese Methode erfordert das Erstellen eines Formulars und das anschließende Auslösen des Absendens des Formulars an eine neue Seite. Der Code ist lang, daher werde ich ihn hier nicht schreiben Lösung.
Bitte beachten Sie, dass die beiden oben genannten Methoden nicht für die Platzierung in der Ajax-Rückruffunktion geeignet sind. Wenn sie in die Rückruffunktion eingefügt werden, werden sie dennoch vom Browser abgefangen.
3. Die ultimative Lösung: Öffnen Sie zuerst das Fenster und leiten Sie dann um
Die dritte Lösung ist eigentlich eine Problemumgehung. Die Kernidee besteht darin, die Seite zuerst durch Benutzerklicks zu öffnen und dann die Seite umzuleiten. Der Beispielcode lautet wie folgt.
js-Code:
xx.addEventListener('click', function () { // Öffne die Seite, am besten verwendest du hier die Eingabeaufforderungsseite var newWin = window.open('loading page'); ajax().done(function() { // Wiederholen Direkt zur Zielseite newWin.location.href = 'target url' });
Die obige Methode öffnet eigentlich zwei Adressen, daher wird empfohlen, dass Sie beim Öffnen der ersten Adresse eine Meldung ähnlich der Meldung „Die aktuelle Seite wird geladen, bitte warten“ ausgeben. . ist eine einfache Eingabeaufforderungsseite, mit der das doppelte Öffnen der eigentlichen Zielseite vermieden werden kann und die Benutzer die Umleitung der Seite bemerken können.
Lösung zwei:
<a href=javascript:; onclick=dialog();>Auf Popup-Fenster klicken</a><script>function dialog(){ $.ajax({ url: 'url', type: 'POST', dataType: 'json', async: false, // Dies muss als synchrone Daten definiert werden: {param1: 'value1'}, success: function(data){ window.open(data.url, '_blank'); //Initiieren Sie a Popup-Fenster} })} </script>
Nachteile dieser Methode:
Der eigentliche Test kann das Abfangproblem der meisten Browser lösen, aber er kann das Abfangen von Sicherheitssoftware nicht lösen (360 wird nicht abfangen, QQ Butler jedoch schon).
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er für das Studium aller hilfreich ist. Ich hoffe auch, dass jeder das VeVb Wulin Network unterstützt.