Hallo,
Hm, nein, das wäre für mich keine logische Lösung. Die clientseitige Programmlogik sollte von Beginn an vollständig vorhanden sein. Diese erst bei Bedarf nachzuladen, halte ich persönlich für keine gute Idee. Das Nachladen bei Bedarf sollte sich auf reine Daten beschränken.
Wenn ich das richtig verstehe, soll ich die "Programmierlogik" schon von anfang an als JS-Funktionen geladen haben. Dann stellt sich aber das Problem, wie diese aufgerufen werden!
Ajax, zumindest das Nachladen per XMLHTTPRequest, läuft als JavaScript. Dieses Script muss das Nachladen ja anstoßen. Dieses Script bekommt via (onreadystatechange) Bescheid, wie weit der Ladevorgang abgeschlossen ist und kann, bei Erfolg, eine weitere Funktion aufrufen.
Aber:
Es funktioniert in allen Browsern, nur Opera stellt sich ein wenig an. Da dieser script-Bereich mit Ajax erst später nachgeladen wird, scheint er ihn nicht auszuführen
Zeig mal, wie Du das SCRIPT-Element nachträglich einbaust.Es handelt sich ja um eine AJAX-Applikation, und zwar verwende ich HTML_AJAX von PEAR.
Ja, der Fluch des Versuchs, ein Script zu erschaffen, welches alles in allen Browsern kann. Tut mir leid, da quäle ich mich jetzt nicht durch. Hier, speziell in "HTML_AJAX.js", musst Du aber vermutlich mit der Fehlersuche ansetzen. Was ich Dir aus eigener Erfahrung sagen kann, ist, dass ein
element.innerHTML = "<script id='mySCRIPT' type='text/javascript'>alert('Hallo Welt innerHTML!');</script>";
nicht funktioniert. Das bei mir allerdings in allen Browsern nicht, nicht nur im Opera nicht. Wenn es bei Dir in einigen Browsern funktioniert, wird scheinbar auch von dem Pear-Script eine irgendwie geartete DOM-Methode eingesetzt.
Hier mal ein Vergleich, was geht, und was Probleme bereitet:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Nachtraegliches Einfuegen von SCRIPT-Elementen</title>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
<script type="text/javascript">
function bindeSCRIPTeinMitInnerHtml() {
//Wird zwar eingehaengt, aber in allen Browsern, die ich getestet habe (IE6.0, FF1.5.0.4, Opera8.5.4), nicht ausgefuehrt. Opera haengt nur ein leeres SCRIPT-Element ein.
var myBody = document.body;
if (document.getElementById("mySCRIPT")) myBody.removeChild(document.getElementById("mySCRIPT"));
myBody.innerHTML += "<script id='mySCRIPT' type='text/javascript'>alert('Hallo Welt innerHTML!');<\/script>";
alert(myBody.innerHTML);
}
function bindeSCRIPTeinMitDOM1() {
//Die [link:http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html@title=DOM-Core-Variante] mit setAttribute und SCRIPT-Inhalt als TextNode,
//funktioniert nur im FF1.5.0.4 und Opera8.5.4, IE kann den TextNode nicht einhaengen
var myBody = document.body;
if (document.getElementById("mySCRIPT")) myBody.removeChild(document.getElementById("mySCRIPT"));
var mySCRIPT = document.createElement("SCRIPT");
mySCRIPT.setAttribute("type", "text/javascript");
mySCRIPT.setAttribute("id", "mySCRIPT");
mySCRIPT.appendChild(document.createTextNode("alert('Hallo Welt DOM1!');"));
myBody.appendChild(mySCRIPT);
alert(myBody.innerHTML);
}
function bindeSCRIPTeinMitDOM2() {
// verwendet die Eigenschaft [link:http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/html.html#ID-81598695@title=HTMLScriptElement].text
//funktioniert in allen getesteten Browsern (siehe oben)
var myBody = document.body;
if (document.getElementById("mySCRIPT")) myBody.removeChild(document.getElementById("mySCRIPT"));
var mySCRIPT = document.createElement("SCRIPT");
mySCRIPT.type = "text/javascript";
mySCRIPT.id = "mySCRIPT";
//Opera8.5.4 fuehrt die Anweisungen sofort aus, noch bevor das Element ueberhaupt eingehaengt wurde.
mySCRIPT.text = "alert('Hallo Welt DOM2!');";
//Opera8.5.4 fuehrt die Anweisungen nochmal aus, nachdem das Element eingehaengt wurde.
myBody.appendChild(mySCRIPT);
//Opera8.5.4 haengt nur ein scheinbar ;-) leeres SCRIPT-Element ein.
alert(myBody.innerHTML);
}
function bindeSCRIPTeinMitDOM3() {
var myBody = document.body;
if (document.getElementById("mySCRIPT")) myBody.removeChild(document.getElementById("mySCRIPT"));
var mySCRIPT = document.createElement("SCRIPT");
mySCRIPT.type = "text/javascript";
mySCRIPT.id = "mySCRIPT";
myBody.appendChild(mySCRIPT);
//Wir setzen den Inhalt des SCRIPT-Elements erst, wenn es schon eingehangen ist, um den Opera auch noch zu ueberreden ;-)
mySCRIPT.text = "alert('Hallo Welt DOM3!');";
alert(myBody.innerHTML);
}
</script>
</head>
<body>
<h1>Hallo Welt!</h1>
<p><button onclick="bindeSCRIPTeinMitInnerHtml()">Binde SCRIPT ein mit innerHTML!</button></p>
<p><button onclick="bindeSCRIPTeinMitDOM1()">Binde SCRIPT ein mit DOM1!</button></p>
<p><button onclick="bindeSCRIPTeinMitDOM2()">Binde SCRIPT ein mit DOM2!</button></p>
<p><button onclick="bindeSCRIPTeinMitDOM3()">Binde SCRIPT ein mit DOM3!</button></p>
</body>
</html>
Das schaut dann so aus, dass man eine Funktion aufruft, der man dann die id eines DIVs und eine Datei auf dem Server nennt, worauf diese Datei mit einer neuen Anfrage in das DIV gepackt wird.
Ja, Deine Aufgabe ist nun, herauszufinden, wie das Pear-JavaScript dies tut.
Wenn Du noch Hilfe willst, solltest Du uns das zumindest mal irgendwohin hochladen, damit man sich das Problem mal ansehen kann.
viele Grüße
Axel