verhindern, dass jquery ajax Javascript aus Skript- oder HTML-Antworten ausführt

8

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)

    
Krzysztof Dk 01.11.2011, 10:23
quelle

4 Antworten

7

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.

%Vor%

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 oder html angegeben ist, findet keine Vorverarbeitung statt. Die Daten werden einfach an den Erfolgshandler übergeben und über die Eigenschaft responseText des Objekts jqXHR verfügbar gemacht.

    
Mark Amery 30.04.2014 19:58
quelle
3

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 oder html angegeben ist, tritt keine Vorverarbeitung auf. Die Daten werden einfach an den Erfolgshandler übergeben und über die Eigenschaft responseText des Objekts jqXHR 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.

    
Lee 14.02.2013 22:00
quelle
-1

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%     
Joey 01.11.2011 10:36
quelle
-1

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.

    
rgb 13.04.2012 03:26
quelle

Tags und Links