molily: Javascript in eingebundener AJAX-Datei

Beitrag lesen

Hallo,

du bist also der Meinung, nachgeladene Scripte sollten mit "eval" zur Verfügung gestellt werden.

Nach meinem jetzigen Wissenstand ja, wobei die Frage nach den Vorteilen der DOM-Methode bzw. Nachteilen von eval durchaus ernst gemeint war.

Einige nennst du ja auf deiner Testseite bereits. Die DOM-Einbindung ist asynchron zum einbindenden Script, d.h. um gleichwertiges zu erreichen, müsste man eval mit setTimeout aufrufen. Je nachdem, was man vorhat, ist das eine oder das andere Verhalten gewünscht.

eval() halte ich vor allem in einem Fall für sinnvoll: Man holt mit XMLHttpRequest HTML-Code, in dem auch, aber nicht nur script-Elemente mit JavaScript-Code vorhanden sind. Wenn man die nun mit innerHTML ins Dokument schreibt, hängen die script-Elemente dort zwar korrekt drin, werden aber bekanntlich nicht ausgeführt. In dem Fall wäre DOM-Einbindung zwar möglich, dann müsste man aber sinnigerweise die existierenden script-Elemente mit sich selbst überschreiben. Etwa so:

var divE = document.getElementById("div");  
divE.innerHTML = "<p>Test</p><script type='text/javascript'>alert('hallo welt');<\/script><script type='text/javascript' src='test.js'><\/script>"; // Beispielhaft für einen möglichen XMLHttpRequest-responseText  
var scripts = divE.getElementsByTagName("script");  
for (var i = 0, script, newScript; script = scripts[i]; i++) {  
 newScript = document.createElement("script");  
 newScript.type = "text/javascript";  
 if (script.src) {  
  newScript.src = script.src;  
 } else {  
  newScript.text = script.text;  
 }  
 script.parentNode.replaceChild(newScript, script);  
}

Wenn man *nur* JavaScript-Code vom Server nachladen will, dann kann man direkt ein script-Element mit entsprechendem src-Attribut einbinden. XMLHttpRequest o.ä. ist dann nicht unbedingt nötig. Dieses Einbinden läuft zwar asynchron, aber es ist kein Problem, dem Server den Namen einer Callback-Funktion zu übergeben (à la JSONP), die aufgerufen wird, wenn der nachgeladene Code ausgeführt ist. Anders würde XMLHttpRequest auch nicht funktionieren, nur der readystatechange-Handler muss nicht global sein.

Mathias