moe: cloneNode kopiert keine Attribute?

Hallo,

ich bin recht neu in dem XML/DOM thema, bin da gezwungenermaßen reingerutscht :).

jetzt hab ich folgende Situation: Ich arbeite an einem AJAX Chat, welcher seinen "Output" über ein von PHP generiertes XML-File erhält. dieses hätte ich eigentlich so formatiert, das im element <row> schon fixfertiges HTML enthält (also alle spans, a und img tags). Ich dachte mir ich nehm einfach das row-element, clone es und häng es im html dann ein. Jetzt wird zwar der TEXT der elemente kopiert, nicht aber die attribute. Gibts eine möglichkeit das die mitgeklont werden, ohne jetzt eine Funktion zu schreiben?

der Quelltext sieht derweil so aus von der betreffenden funktion:

var chatresponse = xmlhttp.responseXML;
var returnlast = chatresponse.documentElement.getElementsByTagName("lastid")[0].firstChild.data;
var session_active= chatresponse.documentElement.getElementsByTagName("readystate")[0].firstChild.data;

var chatrows = chatresponse.documentElement.getElementsByTagName("row");

//write xml to chatwindow
for (var i=0; i<chatrows.length; i++){

row = chatrows[i].cloneNode(true);
    row.appendChild(document.createElement("br"));
    document.getElementById("i_chatwindow").appendChild(row);
}

  1. Hallo,

    dieses hätte ich eigentlich so formatiert, das im element <row> schon fixfertiges HTML enthält (also alle spans, a und img tags). Ich dachte mir ich nehm einfach das row-element, clone es und häng es im html dann ein. Jetzt wird zwar der TEXT der elemente kopiert, nicht aber die attribute.

    Du versuchst XML-Elemente in ein HTML-Dokument einzuhängen. Dabei musst du zwei Dinge beachten:

    • Im IE geht das prinzipiell gar nicht.
    • In anderen Browsern (insb. Gecko/Firefox) werden die XML-Elemente nicht als HTML-Elemente erkannt, wenn du keine XHTML-Namespace-Angabe ins geladene XML-Dokument einfügst. Die Semantik der eingefügten Elemente wird also nicht erkannt, das heißt du fügst zwar z.B. ein Element namens h1 ein, aber der Browser erkennt es nicht als das h1-Element aus HTML. Ebenso werden die Attribute ignoriert, weil sie nicht aus dem XHTML-Namespace stammen.

    Gibts eine möglichkeit das die mitgeklont werden, ohne jetzt eine Funktion zu schreiben?

    Sie werden durchaus mitgeklont und auch eingehängt, aber nicht als HTML-Attribute erkannt, ebensowenig wie das Element, an dem sie hängen.
    Namespace-Angabe für HTML-Elemente im XML-Dokument: xmlns="http://www.w3.org/1999/xhtml"
    Wird dann an Kindelemente vererbt.

    Beispiel:

    <?xml version="1.0" encoding="UTF-8" ?>  
    <root><div xmlns="http://www.w3.org/1999/xhtml" style="color:red">bla</div></root>
    

    Wenn du nun responseXML.documentElement.firstChild klonst, hast du ein echtes XHTML-Elemente, das du einhängen kannst, und dessen Attribute auch beachten werden (nur Firefox, Opera und Safari, nicht IE!).

    Mathias

    1. Hallo Mathias,

      schonmal danke für den guten input. mir ist nochmal was aufgefallen (was deine Vermutung wahrscheinlich bestätigen wird).

      Das Problem liegt nicht bei cloneNode() (da werden alle knoten noch schön geklont, die kann man mit alert auch noch ausgeben), sondern bei appendChild(), das lässt die Attributknoten dann anscheinend links liegen.

      Gibts eine andere möglichkeit, oder wie könnte man das mit einer Funktion schön lösen über mehrere level (verschachteltes xml) damit das sauber ausgegeben wird?

      Besten Dank schonmal

      1. Hallo,

        Das Problem liegt nicht bei cloneNode() (da werden alle knoten noch schön geklont, die kann man mit alert auch noch ausgeben), sondern bei appendChild(), das lässt die Attributknoten dann anscheinend links liegen.

        `
        Äh - hast du nun meinen Hinweis ausprobiert oder nicht? (Hast du ihn gelesen und verstanden? ;))

        Ich kann das jedenfalls nicht nachvollziehen. Wenn ich im Firefox ein Element in einem mit XMLHttpRequest geladenen XML-Dokument anspreche, kann ich ein Attribut mit getAttribute problemlos auslesen - dasselbe, wenn ich klone, dasselbe, wenn ich das geklonte Element in ein HTML-Element einhänge. Das Attribut ist auf jeden Fall da, aber es wird - siehe mein Posting - nicht als HTML-Attribut erkannt, solange im XML-Dokument keine Namespace-Angabe auf die Zugehörigkeit zu (X)HTML hinweist.

        Gibts eine andere möglichkeit, oder wie könnte man das mit einer Funktion schön lösen über mehrere level (verschachteltes xml) damit das sauber ausgegeben wird?

        Ich dachte du willst HTML-Code zur Übertragung in ein XML-Dokument einbetten und den HTML-Code dann wieder das im Browser angezeigte HTML-Dokument einbinden? Oder habe ich dich da falsch verstanden?

        Was willst du jetzt wie ausgeben?

        Mathias

        1. Äh - hast du nun meinen Hinweis ausprobiert oder nicht? (Hast du ihn gelesen und verstanden? ;))

          aaaaah, den letzten kleinen hinweis hab ich glatt übersehen :) das wars, im gecko funktionierts tatsächlich :)

          Ich dachte du willst HTML-Code zur Übertragung in ein XML-Dokument einbetten und den HTML-Code dann wieder das im Browser angezeigte HTML-Dokument einbinden? Oder habe ich dich da falsch verstanden?

          Was willst du jetzt wie ausgeben?

          Mathias

          nochmal zum verständnis. ich fordere im html per AJAX die neuen zeilen im chat an. auf dem server baut mir php dann ein xml file zusammen, wo in den einzelnen rows schon fixfertiges html ist (hintergrund: ich will nicht noch ewig viele zeilen schreiben um das im client dann per js auszugeben, sondern ich will den clientcode so kompakt wie möglich halten). der client bekommt das xml-dokument, holt sich die headerinfos raus und hängt die neuen zeilen an die bestehende ausgabe.

          wie du sagst funktioniert es im FF problemlos, und der IE spuckt einen fehler aus (Typen unverträglich). Und sowas ist marktfürhrer bei browsern :(

          Auf DHTML zurückgreifen will ich nicht, von da komme ich gerade und hab massive speicherprobleme.

          Naja, jedenfalls funktionierts in einem Browser so wie ich das gerne hätte und jetzt schau ich mal weiter... Vielen Dank für deine Hilfe!