Irgendeine Idee, warum der folgende Code das Skriptelement nicht zum DOM hinzufügt?
var code = "<script></script>";
$("#someElement").append(code);
javascript
jquery
Dan Burzo
quelle
quelle
Antworten:
Ich habe Probleme gesehen, bei denen einige Browser einige Änderungen nicht berücksichtigen, wenn Sie sie direkt ausführen (was bedeutet, dass Sie den HTML-Code aus Text erstellen, wie Sie es mit dem Skript-Tag versuchen), aber wenn Sie sie mit integrierten Befehlen ausführen Dinge laufen besser. Versuche dies:
Von: JSON für jQuery
quelle
script.type
ist nicht erforderlich.$("#someElement")[0].appendChild( script );
Die gute Nachricht ist:
Es funktioniert zu 100%.
Fügen Sie einfach etwas in das Skript-Tag ein, z
alert('voila!');
. Die richtige Frage, die Sie vielleicht stellen möchten: "Warum habe ich sie nicht im DOM gesehen?".Karl Swedberg hat den Kommentar des Besuchers auf der jQuery-API-Site gut erklärt . Ich
nichtmöchte alle seine Worte wiederholen, können Sie direkt leseneshier (ich fand es schwer zu navigieren durch die Kommentare dort) .Als nächstes fasse ich die schlechten Nachrichten zusammen, indem ich mithilfe der
.append()
Funktion ein Skript hinzufüge.Und die schlechte Nachricht ist ..
Sie können Ihren Code nicht debuggen.
Ich scherze nicht, selbst wenn Sie ein
debugger;
Schlüsselwort zwischen der Zeile hinzufügen, die Sie als Haltepunkt festlegen möchten, erhalten Sie am Ende nur den Aufrufstapel des Objekts, ohne den Haltepunkt im Quellcode zu sehen (ganz zu schweigen davon, dass dies der Fall ist Das Schlüsselwort funktioniert nur im Webkit-Browser. Alle anderen gängigen Browser scheinen dieses Schlüsselwort wegzulassen .Wenn Sie vollständig verstehen, was Ihr Code tut, ist dies ein kleiner Nachteil. Wenn Sie dies nicht tun, werden Sie
debugger;
überall ein Schlüsselwort hinzufügen , um herauszufinden, was mit Ihrem (oder meinem) Code nicht stimmt. Wie auch immer, es gibt eine Alternative. Vergessen Sie nicht, dass Javascript HTML-DOM nativ manipulieren kann.Problemumgehung.
Verwenden Sie Javascript (nicht jQuery), um HTML-DOM zu bearbeiten
Wenn Sie die Debugging-Fähigkeit nicht verlieren möchten, können Sie die native HTML-DOM-Manipulation mit Javascript verwenden. Betrachten Sie dieses Beispiel:
Da ist es, genau wie früher, nicht wahr? Und vergessen Sie nicht, alle Objekte, auf die verwiesen wird und die nicht mehr benötigt werden, um Speicherlecks zu vermeiden, im DOM oder im Speicher zu bereinigen. Sie können diesen Code zum Aufräumen verwenden:
Der Nachteil dieser Problemumgehung besteht darin, dass Sie möglicherweise versehentlich ein doppeltes Skript hinzufügen, und das ist schlecht. Von hier aus können Sie die
.append()
Funktion leicht nachahmen , indem Sie vor dem Hinzufügen eine Objektüberprüfung hinzufügen und das Skript direkt nach dem Hinzufügen aus dem DOM entfernen. Betrachten Sie dieses Beispiel:Auf diese Weise können Sie ein Skript mit Debugging-Funktion hinzufügen, ohne sich vor Skriptduplizitäten zu schützen. Dies ist nur ein Prototyp, den Sie für alles erweitern können, was Sie möchten. Ich habe diesen Ansatz verwendet und bin damit sehr zufrieden. Sicher genug, ich werde niemals jQuery verwenden
.append()
, um ein Skript hinzuzufügen.quelle
$.getScript
ist in jQuery integriert.Mit der Funktion jQuery kann eine JavaScript-Datei dynamisch geladen werden
getScript
Jetzt wird das externe Skript aufgerufen, und wenn es nicht geladen werden kann, wird es ordnungsgemäß beeinträchtigt.
quelle
eval()
.Was meinst du mit "nicht arbeiten"?
jQuery erkennt, dass Sie versuchen, ein SCRIPT-Element zu erstellen, und führt den Inhalt des Elements automatisch im globalen Kontext aus. Erzählst du mir, dass das bei dir nicht funktioniert? - -
Bearbeiten: Wenn Sie das SCRIPT-Element nicht im DOM sehen (z. B. in Firebug), nachdem Sie den Befehl ausgeführt haben, wird jQuery, wie gesagt, den Code ausführen und dann das SCRIPT-Element löschen - ich glaube, dass SCRIPT-Elemente werden immer an den Körper angehängt ... aber trotzdem - die Platzierung hat in dieser Situation absolut keinen Einfluss auf die Codeausführung.
quelle
Das funktioniert:
Es scheint, als ob jQuery mit Skripten etwas Kluges macht, sodass Sie das HTML-Element anstelle des jQuery-Objekts anhängen müssen.
quelle
Versuchen Sie dies kann hilfreich sein:
quelle
Ich möchte das Gleiche tun, aber ein Skript-Tag in einem anderen Frame anhängen!
quelle
Das
</script>
Literal innerhalb des Strings beendet das gesamte Skript, um zu vermeiden,"</scr" + "ipt>"
dass es stattdessen verwendet werden kann.quelle
"\x3cscript\x3e\x3c/script\x3e"
. In XHTML müssen Sie nur einen auskommentierten CDATA-Block einfügen.</
, was nicht erlaubt ist. Siehe stackoverflow.com/questions/236073/…Das Hinzufügen der Quell-URL zur Skriptdatei hat geholfen, wie auf dieser Seite erwähnt: https://blog.getfirebug.com/2009/08/11/give-your-eval-a-name-with-sourceurl/
quelle
Ihr Skript wird ausgeführt, Sie können es einfach nicht verwenden
document.write
. Verwenden Sie eine Warnung, um sie zu testen und die Verwendung zu vermeidendocument.write
. Die Anweisungen Ihrer js-Datei mitdocument.write
werden nicht ausgeführt und der Rest der Funktion wird ausgeführt.quelle
Dies ist meiner Meinung nach die beste Lösung. Google Analytics wird auf diese Weise injiziert.
quelle
Sie benötigen jQuery nicht, um ein Skript-DOM-Element zu erstellen . Es kann mit Vanilla ES6 wie folgt gemacht werden:
Es muss nicht in a eingeschlossen werden
Promise
, aber auf diese Weise können Sie das Versprechen beim Laden des Skripts auflösen und so die Race-Bedingungen für Skripte mit langer Laufzeit verhindern.quelle
Skript an body anhängen:
quelle
Eine andere Möglichkeit, dies zu tun, wenn Sie Code anhängen möchten, besteht darin, die
document.createElement
Methode zu verwenden, aber dann.innerHTML
anstelle von.src
.quelle
Ich habe versucht , diese ein und funktioniert gut. Ersetzen Sie einfach das
<
Symbol damit\x3C
.oder
Sie können den Code hier testen .
quelle
Kann so versuchen
Der einzige Grund, warum Sie dies nicht tun können,
"<script></script>"
ist, dass die Zeichenfolge in Javascript nicht zulässig ist, da die DOM-Ebene nicht analysieren kann, was js und was HTML ist.quelle
Ich habe ein
npm
Paket geschrieben, mit dem Sie eine HTML-Zeichenfolge, einschließlich Skript-Tags , an einen Container anhängen können die Skripte ausführenBeispiel:
Finden Sie es hier: https://www.npmjs.com/package/appendhtml
quelle
Erstellen Sie einfach ein Element, indem Sie es mit jQuery analysieren.
Arbeitsbeispiel: https://plnkr.co/edit/V2FE28Q2eBrJoJ6PUEBz
quelle