Firefox, das XmlDOM und die rumfrickelei


Thomas Wölfer
Thomas Wölfer

15. Juni 2005


Sowas ärgert mich immer wieder: Mit JavaScript und XML kann man nette Sachen machen - zum Beispiel dynamisch XML-Daten vom Server abholen, diese dann per JavaScript auslesen - und dann zur Anzeige bringen.

Das wäre auch alles ganz prima, wenn man nicht mehrere Browser berücksichtigen müsste - und wenn sich ein bestimmter Browser - und zwar der Firefox - nicht so schwachsinnig verhalten würde. Um folgendes gehts: Angenommen man hat per XmlHttpRequest eine XML-Datei geladen, und verfügt nun über ein xmlDocument. Darin befinden sich hierarchische Daten ein einzelnen Nodes. Angenommen, die Nodes auf höchster Ebene hätten alle den Namen 'item', dann sollte man meinen, das man mit dem Aufruf:

var items = node.childNodes;

alle Childnode von 'node' mit der Bezeichnung 'item' erhält. Das ist nämlich genau das, was man braucht, um sinnvoll über das Dokument iterieren zu können. Und genau das bekommt man auch - beim Internet Explorer.

Beim Firefox hingegen bekommt man was anderes, nämlich alle Childnodes von Node mit dem Name 'item' - und alle Kinder und Kindeskinder der ersten Childnode die auch so heissen. Das ist völlig unbrauchbarer Mist.

Nun kann es natürlich sein, das der Firefox sich hier an irgendeinen Standart hält, der genau dieses Verhalten vorschreibt - nur wäre dann der Standart halt total unsinnig: Es bringt also überhaupt nichts, den dann zu implementieren.

Etweder hier hat jemand bei der Implementierung des XML DOM nicht im geringsten verstanden um was es geht - oder aber der Standart schreibt ein völlig sinnloses Verhalten vor.

Was man gern hinschreiben würde wäre sowas in der Art:

function RenderChildren( node)
{
   for( int i=0; i<node.childNodes.length; i++)
   {
      RenderNode( node.childNodes[i]);
      RenderChildren( node.childNodes[i]);
   }
}

Statt dessen braucht man:

function RenderChildren( node)
{
   for( int i=0; i<node.childNodes.length; i++)
   {
      if( RausFrickelnBestaetigtDasEsEinChildIst( node.childNodes[i], node))
      {
          RenderNode( node.childNodes[i]);
          RenderChildren( node.childNodes[i]);
      }
   }
}

Grauenvoll. Es ist mir völlig unklar wie man die Intention von 'childNodes' derart missverstehen kann, das so eine unsinnige Implementierung dabei rauskommt.