Warum werden Skriptelemente, die mit DOMParser erstellt wurden, nicht ausgeführt?

Ich lade HTML in Ajax und analysiere es mitDOMParser und setzen Sie allechildNodes des Dokumentkörpers in ein Dokumentfragment.

Wenn ich das Fragment zum aktuellen Dokumentkörper hinzufüge,<script> -Tags werden nicht ausgeführt.

Ich habe herumgespielt und herausgefunden, dass sie korrekt ausgeführt werden, wenn ich sie durch neue dynamisch erstellte Skript-Tags ersetze.

Ich würde gerne wissen, WARUM?

Z.B

var html = "Some html with a script <script>alert('test');</script>";

var frag = parsePartialHtml(html);


fixScriptsSoTheyAreExecuted(frag);


document.body.appendChild(frag);


function fixScriptsSoTheyAreExecuted(el) {
  var scripts = el.querySelectorAll('script'),
      script, fixedScript, i, len;

  for (i = 0, len = scripts.length; i < len; i++) {
    script = scripts[i];

    fixedScript = document.createElement('script');
    fixedScript.type = script.type;
    if (script.innerHTML) fixedScript.innerHTML = script.innerHTML;
    else fixedScript.src = script.src;
    fixedScript.async = false;

    script.parentNode.replaceChild(fixedScript, script);
  }
}


function parsePartialHtml(html) {
  var doc = new DOMParser().parseFromString(html, 'text/html'),
      frag = document.createDocumentFragment(),
      childNodes = doc.body.childNodes;

  while (childNodes.length) frag.appendChild(childNodes[0]);

  return frag;
}

Ohne @ anzuruffixScriptsSoTheyAreExecuted, nichts wird ausgeführt.

Ein weiterer Punkt, dem ich nur schwer folgen kann, ist der, wenn ich versuche, die vorhandenen Skriptknoten einfach zu klonen, um mit @ neue zu erstellecloneNode, es funktioniert nicht, was darauf hindeutet, dass die Skript-Tags, die ursprünglich von @ erstellt wurdDOMParser enthält einen Status, der verhindert, dass sie ausgeführt werden.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage