Warum werden cloneNode-Skript-Tags nicht ausgeführt?

8

geklont & lt; script & gt; Tags werden nicht ausgeführt. Warum?

Beispiel:

%Vor%

Nach der Ausführung gibt es zwei Hello-Skripte im Dokument, von denen nur eines ausgeführt wurde.

Ссылка

Dies ist Teil eines größeren Problems, an dem ich arbeite, also weiß ich, dass es eine dumme Sache ist.

    
Aleksandar Totic 27.02.2015, 18:06
quelle

3 Antworten

5

Dieses Verhalten wird von der W3C-HTML5-Spezifikation gefordert.

Jedes <script> -Element hat ein Eigenschaftsflag namens " bereits gestartet ". Die Spezifikation sagt:

  

Anfänglich muss bei Skriptelementen diese Markierung nicht gesetzt sein (Skriptblöcke, wenn sie erstellt werden, sind nicht "bereits gestartet"). Die Cloning-Schritte für Skriptelemente müssen das Flag "Bereits gestartet" für die Kopie festlegen, wenn es für das geklonte Element festgelegt ist.

Und dann später:

  

Wenn das Skriptelement als "bereits gestartet" markiert ist, muss der Benutzeragent diese Schritte an dieser Stelle abbrechen. Das Skript wird nicht ausgeführt.

Die Lösung besteht einfach nicht darin, Skriptelemente zu klonen, sondern komplett neue Elemente zu erstellen, die mit demselben Inhalt gefüllt sind.

    
apsillers 27.02.2015, 18:24
quelle
1

Im Prinzip macht der Browser Folgendes, wenn er <script> auf der Seite ausführt:

Wenn das Skript <script> nicht ausgeführt wurde, bevor es Folgendes ausführt:

  1. Nimmt Text von <script> ;
  2. Aufrufe eval(thatScriptText) ;
  3. Markiert den Knoten <script> DOM als ausgeführt;

Wenn Sie den Knoten klonen, erhält er das interne Flag "executed", das Skript verhindert weitere Ausführungen.

Lösung: Wenn Sie möchten, dass das Skript erneut ausgeführt wird, führen Sie die Schritte 1 und 2 aus. Klonen ist in diesem Fall nicht erforderlich.

    
c-smile 27.02.2015 18:21
quelle
1

Ich weiß nicht, warum es nicht mit cloneNode funktioniert, aber Sie können dasselbe Ergebnis erzielen, indem Sie innerHTML in einen neuen Skriptknoten kopieren.

%Vor% %Vor%
    
Barmar 27.02.2015 18:22
quelle

Tags und Links