Laut Dokumentation:
Wenn html angegeben wird, wird jedes eingebettete JavaScript innerhalb des abgerufenen Daten werden ausgeführt, bevor der HTML-Code als Zeichenfolge zurückgegeben wird. Ähnlich, Skript wird das JavaScript ausführen, das von dem zurück gezogen wird Server, dann nichts zurückgeben.
Wie kann ich das verhindern? Ich habe js, die den Inhalt ändern, der durch Ajax erhalten wird. Die Ausführung vor der Rückgabe des HTML-Codes ist nicht sinnvoll, da kein Inhalt zur Bearbeitung vorhanden ist (zumindest in meinem Fall).
mein Code:
%Vor%Das von ajax empfangene Skript wird zweimal ausgeführt. Zuerst von mir in der eval (Antwort), dann jquery führen Sie es erneut aus (wie in der Dokumentation beschrieben)
Lees Antwort adressiert bereits ausreichend den Fall von HTML-Antworten - darin eingebettete Skripte sind nicht tatsächlich automatisch ausgeführt, es sei denn, Sie fügen dem DOM den HTML-Code hinzu, im Gegensatz zu der falschen Dokumentation, die Sie zitiert haben.
Das lässt den anderen Fall in Ihrem Fragetitel nach - verhindern, dass Skript -Antworten automatisch ausgeführt werden, wenn sie empfangen werden. Sie können dies einfach mit der Einstellung dataType
tun.
Wenn Sie dataType
auf 'text'
setzen, ignoriert jQuery den vom Server zurückgegebenen Header Content-Type
und behandelt die Antwort wie einfachen Text. Dadurch wird das Standardverhalten für JavaScript-Antworten verhindert (dh sie werden ausgeführt). Aus den (kürzlich korrigierten) Dokumenten :
Der Typ der Vorverarbeitung hängt standardmäßig vom Inhaltstyp der Antwort ab, kann jedoch explizit mit der Option dataType festgelegt werden. Wenn die dataType-Option bereitgestellt wird, wird der Content-Type-Header der Antwort ignoriert.
...
Wenn
text
oderhtml
angegeben ist, findet keine Vorverarbeitung statt. Die Daten werden einfach an den Erfolgshandler übergeben und über die Eigenschaft responseText des ObjektsjqXHR
verfügbar gemacht.
jQuery.ajax
bewertet nicht Skripts bei der Rückgabe, wenn HTML angefordert wird. Die Passage, die Sie in der Frage zitiert haben, war in der Tat ein seit langem bestehender Fehler in der Dokumentation, die seit April 2014 repariert wurde . Die neuen Docs haben dies zu sagen (Hervorhebung von mir):
"html": Gibt HTML als einfachen Text zurück; Eingeschlossene Skript-Tags werden beim Einfügen in das DOM ausgewertet.
...
Wenn
text
oderhtml
angegeben ist, tritt keine Vorverarbeitung auf. Die Daten werden einfach an den Erfolgshandler übergeben und über die Eigenschaft responseText des ObjektsjqXHR
verfügbar gemacht.
In diesem Fall werden die Skripte ausgewertet, wenn Sie
aufrufen %Vor%Wenn Sie die Skripts vor dem Einfügen der Antwort in das DOM nicht auswerten möchten, sollten Sie Folgendes tun können:
%Vor% parseHTML
ist der Schlüssel dafür, dass standardmäßig Skript-Tags entfernt werden. Beachten Sie jedoch, dass parseHTML nicht sicher ist und wenn Ihre Quelle unbekannt ist, ist dies immer noch ein Sicherheitsrisiko.
In der Dokumentation wird angegeben, dass eingebettetes JavaScript in den abgerufenen Daten ausgeführt wird, bevor der HTML-Code als Zeichenfolge zurückgegeben wird. Wenn Sie dann alles, was Sie mit Ihrem Ajax-Aufruf abgerufen haben, ändern möchten, können Sie dies innerhalb der succes-Eigenschaft tun:
%Vor%Das ist eines der wirklich nervigen Dinge an jQuery, dass JavaScript bei der Antwort ausgeführt wird. Andere Frameworks wie MooTools deaktivieren die Skriptausführung von Antworten, es sei denn, Sie legen explizit fest, dass sie ausgeführt werden sollen, was ein viel besserer Ansatz ist.
Der einzige Weg, um Skripts zu verhindern, ist das Hinzufügen eines benutzerdefinierten dataFilter Es ist einfach genug, aber ich denke, es sollte Standard sein und eine Ajax-Option, um Skript-Ausführung zu ermöglichen, wenn Sie es wollen (ich hatte nie eine Verwendung dafür und andere Frameworks deaktivieren standardmäßig für die Sicherheit etc.)
Beispiel
%Vor%** AKTUALISIERT ** Benötigt diese verrückte Regex, um mehr Script-Tag-Instanzen zu behandeln
HINWEIS Wenn dataType nicht in Optionen festgelegt wurde, wird es in dataFilter undefiniert sein, so dass ich es nur als Text für den Filter festlege - wenn Sie diese Zeile entfernen, funktioniert es nur, wenn dataType explizit gesetzt ist.
Tags und Links javascript html jquery ajax