Hi
Hm. Nagut. dann halt nochmal.
Ich habe eine Seite und ein Teilbereich der Seite wird mit Hilfe von Sarissa dynamisch aus einer XML Datei erstellt und in ein <div id="content"> geladen.
Während dieser Transformation erstellt das XSL auch einige JavaScript Funktionen dynamisch. Diese werden dann ebenfalls in das content div integriert, da ja nur dieser Bereich der Seite von der Transformation betroffen ist.
Das nachträgliche Einfügen der <script> Bereiche im Content div führt jedoch dazu, dass diese vom Javascript interpreter nicht interpretiert werden und darin definierte Funktionen somit nicht bekannt sind! (onChange deklarationen von elementen funktionieren interessanterweise, nur die funktionsdefinitionen nicht).
Daher die Idee die Funktionen NACH der Transformation in den Head Bereich der Seite einzubinden (per appendChild), da sie dann dem JavaScript interpreter bekannt sind und verwendet werden können.
Im FireFox funktioniert das Ganze wunderbar auf die folgende Weise:
var headID = document.getElementsByTagName("head")[0];
var newScript = document.createElement('script');
newScript.type = 'text/javascript';
newScript.innerHTML = document.getElementById("xsl_JavaScript").innerHTML;
headID.appendChild(newScript);
das element "xsl_javascript" ist hierbei z.B. ein <script> mit entspr. id, welcher während der xsl transformation dem dokument innerhalb des content divs hinzugefügt wurde.
Ich hoffe bis hier her ist es noch verständlich.
Nun die Probleme im IE:
1. <script>.innerHTML gibt es nicht! Auch andere Varianten um die Methodendefinition in das neu erstellte <script> element zu schreiben habe ich nicht gefunden!
(diese variante funktioniert z.B. auch nicht)
newScript.appendChild(document.createTextNode(document.getElementById("xsl_JavaScript").innerHTML));
2. wenn ich per XSL ein <script> objekt erstelle erscheint dieses NICHT im DOM des dokuments! (IE developer Toolbar zeigt es nicht). Deswegen, und weil ein <script> block keine id definiert hat, wird statt
<script type="text/javascript">myFunc = function(){alert("hallo");};</script>
halt einfach
<div id="xsl_JavaScript" style="disply:none">myFunc = function(){alert("hallo);};</div>
erstellt. Mit dem Ziel den innerHTML dieses divs in einen script block zu packen und den div der ordnung halber anschließend zu löschen.
Das eigentliche Problem ist also das dynamische Erstellen von Javascript funktionen welche durch eine XSL transformation dem document hinzugefügt wurden.
Der Ansatz das ganze in den <head> Bereich zu schreiben erscheint mir sinnig, da auf diese Weise ja z.B. externe .js Skripte nachträglich eingebunden werden können, und es ja im FF auch funktioniert.
Die daraus resultierende Frage ist also:
Wie kriege ich in den <script> block meinen inhalt?
achtung pseudocode:
<script type="text/javascript">innerHTML von xsl_JavaScript-div</script>
Alternativ natürlich auch andere Vorschäge um meine Funktionen zu nutzen!
Hier nocheinmal der Hinweis, onChange definitionen von input fields funktionieren nach der transformation bereits. sie sollen jedoch die dynamisch erstellte funktion aufrufen! und diese ist nicht bekannt!!
So, ich hoffe das ganze war nun verständlich erklärt.
grüße
ich