Jens Glander: alle Eigenschaften Objekthierachie abfangen ... geht das?

Ich habe folgendes Problem:

Ich möchte einen Objektbaum, wie den vom Objekt 'window' komplett durchlaufen, um mir alle Eigenschaften des Objektbaums anzeigen zu lassen.

Meine Idee war in einer 'for (var Eigenschaft in Objekt){...}' Schleife zunächst alle Eigenschaften des Objekts (z.B. 'window') abzufragen. Das klappt. :-)
Dann nehme ich mir alle Eigenschaften des Objekts vor, die gemäß der typeof()-Methode vom Typ "object" sind und durchlaufe die obige for-in Schleife wieder und wieder (sozusagen rekursiv). Das geht zunächst gut, aber bei einem Object der dritten Ebene (beim Beispiel window) geht im IE5 irgendwas in die Hose: :-(

Ich schreibe es mal konkret für das betreffende Objekt 'window.clientInformation.mimeTypes' auf:

bei:

for (Eigenschaft in window.clientInformation.mimeTypes){

// Coding  ...
    
}

passierts: hier liefert der IE5 eine hässliche Fehlermeldung "A runtime error has occured ... etc."

Kann mir jemand erklären, warum hier dieser Fehler auftritt, oder noch schöner wie ich mein eigentliches Problem "zeige alle Eigenschaften eines Objektbaums" löse?

Danke für die vielen Lösungsvorschläge im vorhinein :-)

Jens

  1. Moin Jens!

    Ich schreibe es mal konkret für das betreffende Objekt 'window.clientInformation.mimeTypes' auf:
    bei:

    for (Eigenschaft in window.clientInformation.mimeTypes){
      // Coding  ...
    }

    »»

    passierts: hier liefert der IE5 eine hässliche Fehlermeldung "A runtime error has occured ... etc."

    Aha. Und *was* fuer einer??

    Zwei Dinge fallen mir zu dem Thema ein:
    1. Du verwendest wahrscheinlich eine Rekursion, d.h. bei zu tiefer Verschachtelung kann es zu einem Stackueberlauf kommen (das waere z.B. ein Runtime error).  
    2. Objekte koennen gegenseitig auf sich verweisen. So hat z.B. schon window selbst die Eigenschaften parent, self, top und window, die alle auf das window-Objekt selbst verweisen (ausser bei Framesets). Formular-Elemente haben die Eigenschaft form, um auf das Formular zu verweisen, zu dem sie gehoeren. Dieses Formular enthaelt aber wieder Verweise auf eben diese Elemente, usw. Du wirst also bald in eine Endlosschleife geraten, wenn Du nichts unternimmst, um das zu vermeiden, und dann wird nicht nur Punkt 1 schnell interessant, sondern es wird auch jede Menge mehr Speicher gebraucht, um all die erzeugten Daten zu speichern.

    HTH && So long

    1. Moin Jens!

      Ich schreibe es mal konkret für das betreffende Objekt 'window.clientInformation.mimeTypes' auf:
      bei:

      for (Eigenschaft in window.clientInformation.mimeTypes){
        // Coding  ...
      }
      »»  
      passierts: hier liefert der IE5 eine hässliche Fehlermeldung "A runtime error has occured ... etc."

      Aha. Und *was* fuer einer??

      Zwei Dinge fallen mir zu dem Thema ein:

      1. Du verwendest wahrscheinlich eine Rekursion, d.h. bei zu tiefer Verschachtelung kann es zu einem Stackueberlauf kommen (das waere z.B. ein Runtime error).
      2. Objekte koennen gegenseitig auf sich verweisen. So hat z.B. schon window selbst die Eigenschaften parent, self, top und window, die alle auf das window-Objekt selbst verweisen (ausser bei Framesets). Formular-Elemente haben die Eigenschaft form, um auf das Formular zu verweisen, zu dem sie gehoeren. Dieses Formular enthaelt aber wieder Verweise auf eben diese Elemente, usw. Du wirst also bald in eine Endlosschleife geraten, wenn Du nichts unternimmst, um das zu vermeiden, und dann wird nicht nur Punkt 1 schnell interessant, sondern es wird auch jede Menge mehr Speicher gebraucht, um all die erzeugten Daten zu speichern.

      HTH && So long

      Hey Calocybe!

      Danke für deine Antwort. Aber ...
      Es handelt sich zwar um eine Rekursion, das ist schon richtig und mir ist auch die Gefährlichkeit von Rekursionen bewusst:
      Das eine Rekursion leicht mal in eine Endlosschleife laufen kann, muss natürlich bedacht werden und könnte von meiner JavaScript-Funktion auch leicht abgefangen werden.
      Doch das Problem tritt in der dritten Ebene (Tiefe der Schleife auf) ... mit Stacküberlauf ist das wohl nicht zu erklären. Ausserdem tritt das Problem ja auch (ohne Rekursion!) für das Objekt 'window.clientInformation.mimeTypes' sofort auf wenn ich das Coding

      for (Eigenschaft in window.clientInformation.mimeTypes){
         // Coding  ... z.B.: alert(Eigenschaft);
      }

      ausführe!!!

      Ich bin also noch nicht zufrieden und hoffe auf weitere Vorschläge.

      Gruß Jens

      1. Hi again!

        Ausserdem tritt das Problem ja auch (ohne Rekursion!) für das Objekt 'window.clientInformation.mimeTypes' sofort auf wenn ich das Coding ...

        Tja, da weiss ich auch nichts dazu. Mit den zahllosen Bugs des IE5+ kenn ich mich nicht aus, ich benutze nur Netscape. ;-)

        So long