JS-Funktionaufruf aus XML dynamisch zusammenbauen
Ole Schneider
- javascript
0 molily
He ho ihr alle,
ich beschäftige mich mit AJAX und hatte grad ne (für meinen Anwendungsfall) super Idee. Leider weiß ich net ob sich das umsetzen lässt und brauch deshalb eure Hilfe.
Die Idee: ich möchte vom Server sog. Updates in Form von XML an den Client senden. Ein Update kann prinzipiell alles sein: das komplette Ersetzen eines Teil des DOM, das Ersetzen eines einzelnen Textknoten etc. Wie genau der Client mit den Updates umzugehen hat steht im XML. Da jedes Update auf dem Client von ner bestimmten Funktion umgesetzt wird, sieht das XML das der Client erhält so aus:
<updates>
<update>
<function>handleThis</function>
<parameter><![CDATA[42]]</parameter>
<parameter><![CDATA[etwas Text]]</parameter>
</update>
<update>
<function>andHandleThat</function>
<parameter><![CDATA[<p id="xy"> some 'invalid' HTML <]]</parameter>
</update>
...
</update>
Wichtig:
- die Parameterliste ist unterschiedlich lang, klar... :-)
- jeder Parameter ist in ner CDATA-Section enthalten, da es sein kann, dass hier HTML-Code übergeben wird, der definitiv nicht XML-konform ist.
Der Client geht also her, holt sich alle "update"-Knoten und ruft für jeden die darin enthaltene Funktion mit der entsprechenden Parameterliste auf.
Klar könnte ich den Funktionsaufruf nun als String zusammenbauen und per eval() ausführen. Das funktioniert aber nur, wenn der im Parameter enthaltene HTML Code keine " bzw. ' enthält - also NIE!
Was funktioniert ist den HTML Code mittels JS-Dom-Funtionen aus dem XML zu holen und an ne Funktion zu übergeben, von der ich BEREITS WEISS, dass sie die richtige ist, also so:
...
var html = parameter[i].firstChild.data;
doSomethingWithTheHtml(html);
...
Nochmals: Im Beispiel kenne ich die Funktion schon. Bei dem Ansatz wie ich es gerne hätte, erfahre ich die Funktion auch erst aus dem XML. Sie liegt mir also nur als String vor.
Wie kann ich das machen? Bin kein son JS-Experte - wie man vielleicht gemerkt hat... :-)
Tausend Dank. Ich bleib die Nacht wach und warte auf eure Antworten.
Ole
Hallo,
wenn ich das richtig verstehe, hast du einen Funktionsnamen als String. Schematisch:
var funktionsname = [hole aus dem XML-DOM];
var parameter = [hole aus dem XML-DOM];
Jetzt willst du die Funktion ausführen, deren Name in der Variable steht, und ihr den/die Parameter übergeben.
Gut, wenn die fragliche Funktion eine globale ist, kannst du einfach schreiben:
windowfunktionsname;
Das geht so mit allen Objekten; objekt.unterobjekt kann man auch objekt["unterobjekt"] schreiben, das spricht dasselbe Unterobjekt an. Dieser String kann dann auch variabel sein, also var name = "unterobjekt"; und objekt[name].
Mathias
Au mann, habs grad erst gesehen. Hab doch gesagt ich bleib wach!!! Allerdings fallen mir grad die Augen zu und ich werds wohl morgen ausprobieren müssen. Hört sich aber alles plausibel an. Jippie!
JETZT BIN ICH RICHTIG HAPPY.
Danke Mathias. Ich meld mich morgen wieder!
Ole
Supi, funktioniert!
jetzt kommt aber gleich das nächste Problem: die Parameterliste. Die anzahl der parameter ist unterschiedlich lang. Aufgrund des enthaltenen HTML in manchen Parametern kann ich die nicht aus dem XML holen, als String zusammenbauen und per eval auslesen. sonst bin ich ja da wo ich vorher war. bin ich eigentlich sowieso oder?
die einzige idee die ich habe ist aus allen vorhandenen parametern ein objekt zu bauen und an die jeweilige funktion zu übergeben. das würde aber bedeuten, das alle funktionen auch exakt ein Objekt als Parameter erwarten. Das würde meine Anwendung aber einschränken. Gehts auch anders?
Danke.
Ole
Hell-O!
die einzige idee die ich habe ist aus allen vorhandenen parametern ein objekt zu bauen und an die jeweilige funktion zu übergeben. das würde aber bedeuten, das alle funktionen auch exakt ein Objekt als Parameter erwarten. Das würde meine Anwendung aber einschränken. Gehts auch anders?
Schau dir mal Function.arguments an, das könnte helfen. Ansonsten: Was spricht dagegen, der Funktion ein Objekt zu übergeben, wenn es die entsprechende Eigenschaft in dem Parameter-Objekt nicht gibt, musst du so oder so entsprechend reagieren. Ein Objekt hätte halt den Vorteil, dass die Parameter in der Funktion eindeutig sind:
function tu_was(obj) {
var Parameter1 = obj['foo'] ? obj['foo'] : 0;
var Parameter2 = obj['baz'] ? obj['baz'] : 0;
alert(Parameter1 + Parameter2);
}
var Liste1 = { "foo": "bar", "baz" : 42 };
var Liste2 = { "foo": "boo" };
tu_was(Liste1);
tu_was(Liste2);
Das hätte den Vorteil, dass die Übergabereihenfolge der Parameter schnurz ist, da du sie als Eigenschaften deines Parameter-Objektes hast.
Siechfred