Anhängen von html-jQuery-element, ohne ausführen von scripts im html-Code
Ich geschrieben habe einige code, der einen string von html und reinigt entfernt alle hässlich HTML von es mit jQuery (siehe ein früher Prototyp in diese Frage ALSO). Es funktioniert ziemlich gut, aber ich bin auf ein Problem:
Bei der Verwendung .append() umschließen den html-Code in ein div, der alle script-Elemente in den code ausgewertet und ausgeführt (siehe diese SO beantworten für eine Erklärung, warum dies geschieht). Ich will das nicht, ich habe wirklich nur wollen, dass Sie entfernt werden, aber ich kann damit umgehen, dass später selbst, solange Sie nicht ausgeführt werden.
Ich bin mit diesem code:
var wrapper = $('<div/>').append($(html));
Habe ich versucht, es zu tun auf diese Weise statt:
var wrapper = $('<div>' + html + '</div>');
Aber das bringt den Fehler "Zugriff verweigert" im IE, dass die append () - Funktion behebt (siehe die Antwort, die ich oben verwiesen).
Ich glaube, ich könnte in der Lage sein, um zu umschreiben, dass mein code nicht verlangen, ein wrapper um das html, aber ich bin mir nicht sicher, und ich würde gerne wissen, ob es möglich ist, Anhängen, html, ohne das ausführen von Skripten in der es sowieso nicht.
Meine Fragen:
-
Wie kann ich wickeln Sie ein Stück unbekannte html
ohne das ausführen von Skripten drin,
vorzugsweise entfernen Sie Sie ganz? -
Sollte ich werfe jQuery aus dem Fenster
und dies mit plain JavaScript und
DOM-manipulation statt? Würde das helfen?
Was ich versuche nicht zu tun:
Ich versuche nicht, die haben so eine Art security layer auf der client-Seite. Ich bin sehr wohl bewusst, dass es sinnlos wäre.
Update: James' Vorschlag
James schlug vor, ich sollte herausfiltern die script-Elemente, aber schauen Sie, diese beiden Beispiele (die ursprüngliche erste und der James' Vorschlag):
jQuery("<p/>").append("<br/>hello<script type='text/javascript'>console.log('gnu!'); </script>there")
hält den text-Knoten, sondern schreibt gnu!
jQuery("<p/>").append(jQuery("<br/>hello<script type='text/javascript'>console.log('gnu!'); </script>there").not('script'))`
Nicht gnu schreiben!, verliert aber auch der text-Knoten.
Update 2:
James hat aktualisiert seine Antwort, und ich habe es akzeptiert. Siehe meinen letzten Kommentar zu seiner Antwort, aber.
Du musst angemeldet sein, um einen Kommentar abzugeben.
, Wie Sie über das entfernen des Skripts zuerst?Vorausgesetzt, Skript-Elemente in html sind nicht verschachtelt in anderen Elementen:Diese Werke für den Fall, dass html nur text-und der html-text hat außerhalb der Elemente.
not()
funktioniert nur, wenn das script nicht versteckt in einem anderen element.jQuery(wrapper).find('script').remove()
. Es funktioniert in Chrome, jetzt werde ich versuchen, es in IE (kriechen)Unten ist eine alternative Möglichkeit, um zu verhindern, dass Skripte innerhalb einer geladenen html-von läuft:
In details sind es, die hier beschrieben - JavaScript: Wie Sie verhindern, dass die Ausführung von JavaScript innerhalb einer html Hinzugefügt, um den DOM.
Wahrscheinlich, diese Lösung wird nützlich sein für jemanden.
Sie sollten entfernen Sie die
script
Elemente:Zweiter Versuch:
node-validator genutzt werden kann, in den browser:
https://github.com/chriso/node-validator
Alternativ PHPJS hat eine Funktion strip_tags (regex/böse-basiert):
http://phpjs.org/functions/strip_tags:535
jQuery("<div/>").append(jQuery("<br/>hello<script type='text/javascript'>console.log('gnu!'); </script>there").remove('script'))
. Es läuft immer noch die script-Tags, eigentlich, und entfernt nur eines der text-Knoten... Interessant...$(html)
... Es scheint die Lösung wäre entfernen Sie die script-Elemente mit einer regex?