hi,
um einen per XMLHTTPRequest geholten XHTML-Dokumentteil in ein bestehendes Dokument einzufügen wollte ich, um nicht stumpf .responseText über .innerHTML irgendwo reinzuklatschen, mir $E so anpassen, dass es das XML rekursiv durchläuft, und die entsprechenden Elemente erzeugt und einfügt.
Klappt auch ganz gut, in Browsern (Code siehe unten) - der IE weigerte sich zunächst hartnäckig, meldet einen Fehler "Typkonflikt" bei der Anweisung
el.appendChild(insertXML(XMLNode.childNodes[i]));
im letzten IF der Funktion.
Durch Debugausgaben (auskommentiertes alert()) bin ich dann darauf gestossen, dass FireFox und Opera mit als erstes Kindelement eines mit dem nodeName "div" und nodeType 1 liefern - der IE meldet mir davor aber noch einen Knoten "xml" vom Typ 7.
Wenn ich dann untiges IF, dass auf diesen Typ 7 abfragt, ent-kommentiere - dann funktioniert die Funktion auch im IE wie gewünscht.
Da er ganz zu Beginn der Funktion den XML-Dokumentknoten aber richtig als "#document" vom Typ 9 erkennt, wunderte ich mich, wo er dann "xml" Typ 7 herzaubert, den die anderen Browser nicht (er)kennen?
Laut SELFHTML ist 7 ein "Knoten für Verarbeitungsanweisung" - was habe ich mir darunter vorzustellen?
Die DOM Level 2 Core Specification nennt das Ding auf englisch analog PROCESSING_INSTRUCTION_NODE, also vom Typ Interface ProcessingInstruction.
Aber aus der Beschreibung dort werde ich auch nicht ganz schlau, was ich mir konkret darunter vorzustellen habe ...?
"The ProcessingInstruction interface represents a 'processing instruction', used in XML as a way to keep processor-specific information in the text of the document."
Der Javascript-Code der Funktion:
function insertXML (XMLNode) {
#var el;
if (XMLNode.nodeType == 9) {
el=document.createDocumentFragment();
}
else {
if (XMLNode.nodeType == 1) {
// Element erzeugen
el=document.createElement(XMLNode.nodeName);
// Attribute zuweisen
for (i=0,attr=XMLNode.attributes,l=attr.length; i<l; i++) {
// toLowerCase für Opera, der die Attributnamen aus dem XML in Großbuchstaben liefert,
// sie dann aber in dieser Schreibweise zugewiesen nicht akzeptieren mag
el[XMLNode.attributes[i].nodeName.toLowerCase()] = XMLNode.attributes[i].nodeValue;
}
}
else {
if (XMLNode.nodeType == 3) {
// Textknoten anlegen
el = document.createTextNode(XMLNode.data);
}
}
}
// rekursiver Aufruf für Kindknoten
if (XMLNode.hasChildNodes()) {
for (var i=0, c=XMLNode.childNodes.length; i<c; i++) {
//alert("Knotenname: "+XMLNode.childNodes[i].nodeName+"\nKnotentyp: "+XMLNode.childNodes[i].nodeType);
//if (XMLNode.childNodes[i].nodeType != 7) {
el.appendChild(insertXML(XMLNode.childNodes[i]));
//}
}
}
return el;
}
Beim Aufruf von XMLHTTPRequest zurückgeliefertes XML-Dokument für meinen Test:
<?xml version="1.0" encoding="utf-8"?>
<div>
<p>Der folgende Link führt zu <a href="http://example.com/" title="Link zu example.com"><strong>example.com</strong></a>, der <em>Beispiel-Domain</em> - jawohl!</p>
</div>
gruß,
wahsaga
/voodoo.css:
#GeorgeWBush { position:absolute; bottom:-6ft; }