schildi: alle ids einer seite auslesen

hallo,

gibt es eine einfache möglichkeit, alle definierten ids einer html seite auszulesen?

danke!

  1. Hallo schildi,

    Du müsstest dich mit dem node-Objekt durch den kompletten Elementbaum hangeln und falls vorhanden für jedes Element die ID auslesen. Einfach würde ich das aber nicht nennen.

    Gruß Gernot

    1. ja - dachte es gäb viell. etwas einfacheres als das.
      war wohl nix...

      1. Hi,

        ja - dachte es gäb viell. etwas einfacheres als das.
        war wohl nix...

        Na ja: Mit innerHTML die Seite in eine Variable holen und diese dann nach ' id="' durchsuchen. ;->

        Gruß, Cybaer

        --
        Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
    2. Hallo Gernot, schildi

      Du müsstest dich mit dem node-Objekt durch den kompletten Elementbaum hangeln und falls vorhanden für jedes Element die ID auslesen. Einfach würde ich das aber nicht nennen.

      Och, es geht eigentlich, der resultierende Code ist dann doch ganz einfach:

      function getIds() {  
        var elements = document.getElementsByTagName("*");  
        var ids = new Array;  
        for (var i = 0; i < elements.length; i++) {  
          var id = elements[i].getAttributeNode("id");  
          if (id) {  
            ids.push(id.nodeValue);  
          }  
        }  
        return ids;  
      }
      

      Die Funktion gibt ein Array mit allen IDs eines Dokumentes zurück. Dazu sammelt sie erst in elements alle Elemente des Dokumentes, überprüft dann in der Schleife, ob das aktuelle Element einen Attributknoten id="bla" besitzt und hängt den Wert des ID-Attributes, wenn vorhanden, an das Array ids an.

      Tim

      1. Hallo Tim,

        document.getElementsByTagName("*");

        Dass das geht war mir neu. Das ist ja dann auch kein Gehangel mehr. Danke, da habe ich was gelernt.  
          
        Gruß Gernot
        
        1. Hallo,

          document.getElementsByTagName("*");

          
          > Dass das geht war mir neu.  
            
          Mir auch. Ich hab es dann einfach (flasch) ausprobiert und Christian Kruse hat mir bei meinem Genörgel übers Nicht-Funktionieren im Chat den Tip mit der richtigen Syntax gegeben. Der Dank geht an ihn. ;)  
            
          Hier mal ein umfangreicheres Beispiel dazu, ich wollte einfach mal was nur mit DOM machen (inzwischen nicht mehr):  
          <http://tepasse.org/tmp/ids-eines-dokumentes-ermitteln>  
            
          Tim
          
          1. Hallo Tim,

            Grundlagenforschung (man weiß ja nie wofür das später mal gut sein könnte) ist auch mein Steckenpferd ... ;-)

            Hier mal ein umfangreicheres Beispiel dazu, ich wollte einfach mal was nur mit DOM machen (inzwischen nicht mehr):
            http://tepasse.org/tmp/ids-eines-dokumentes-ermitteln

            "Mit dem Mauszeiger über der Tabelle schweben, um die IDs des Dokumentes farblich zu markieren"

            In welchem Browser soll das denn gehen? Oder ist das der Grund für "inzwischen nicht mehr"?

            Bei mir tut sich da nichts (IE6, MOZ 1.7.2, OP7.54)

            Obwohl ich mir sicher bin, das müsste man eigentlich hinbekommen ...

            Gruß Gernot

            1. Hallo Gernot,

              "Mit dem Mauszeiger über der Tabelle schweben, um die IDs des Dokumentes farblich zu markieren" In welchem Browser soll das denn gehen?

              In Safari geht das problemlos. Und naiv wie ich manchmal bin, dachte ich, daß solch grundlegendes DOM-Zeug dann auch woanders klappt. Aber tatsächlich nicht, hier gerade getestet in Firefox und Opera.

              Dabei ist das eigentlich keine Rocket Science, ich setze die Tabelle mittels DOM-Methoden zusammen und gebe jeder Tabellenzelle zusätzlich noch die Attribute onMouseover und onMouseout. Dazu nutze ich nur document.createAttribute(), node.nodeValue und node.setAttributeNode(). Die beiden Event-Handler rufen dann die Funktionen highlight() und lowlight() auf, die extrem billig sind und eigentlich nix anderes machen, als die Tabellenzeile farblich zu markieren und den entsprechenden IDs im Restdokument einen roten Rahmen zu verleihen.

              Das ist mir extrem rätselhaft. Laut Firefox' DOM-Inspector werden die Event-Handler auch korrekt angelegt. Die einzige Erklärung, die mir einfällt, ist, daß durch JS erzeugte Event-Handler dann in den meisten Browsern nicht wirksam werden, aus was für Gründen auch immer. Detlef meinte gerade, er hätte sowas mal gelesen. Ich recherchier mal.

              Punkt für Safari, nehme ich mal an. ;)

              Oder ist das der Grund für "inzwischen nicht mehr"?

              Nein, das war nur die manchmal recht nervige Umständlichkeit, wenn man nur mit DOM-Methoden und nicht mit so etwas bequemen wie innerHTML arbeitet. Ich nehm mir immer vor, endlich mal ein paar vereinfachende Funktionen zu basteln, komme aber nie dazu. ;)

              Tim

              1. Hallo,

                Ich recherchier mal.

                OK, damit eventuelle Archivsucher nicht nur einen fragenden Beitrag finden, sondern auch was hilfreiches, dokumentiere ich mal:

                Ich, vollkommen im DOM-Wahn und an Events seit jeher uninteressiert gewesen habe meine Event-Handler im Prinzip so erstellt ...

                attr = document.createAttribute("onMouseover");  
                attr.nodeValue = "tueDiesUndDas()";  
                node.setAttributeNode(attr);
                

                ... also in der extrem stilisierten und, schlimmer, extrem umständlichen Syntax der DOM-Methoden. Und damit definierte Event-Handler werden von den hier getesteten Browsern nur im Safari aktiv. Aber es gibt ja nicht nur eine Variante für Events, genauer scheint es da einen ganzen Zoo zu geben. Zum Beispiel:

                Daniel schlug mir dieses Variante vor:

                node.onmouseover = "tueDiesUndDas()"

                (Sinnigerweise finde ich dafür nirgens einen Standard. Ist das noch aus Netscape-JS-Zeiten?)

                Dann gibt es noch DOM Level 2 Events mit einem weiteren komplizierten Modell, das aber im wesentlich auf dieses hinausläuft:

                node.addEventListener("mouseover", tueDiesUndDas, true)

                Siehe auch SELFHTML: DHTML, DOM-Modelle, Event-Handling beim DOM

                Beides sollte dann wohl aktive Event-Handler im HTML-Dokument hervorbingen, wenn es nicht gerade irgendwo Bugs gibt. Es gibt einige Threads dazu im Archiv:
                http://forum.de.selfhtml.org/archiv/2005/3/t104621/
                http://forum.de.selfhtml.org/archiv/2004/6/t82376/
                http://forum.de.selfhtml.org/archiv/2004/10/t91627/

                Punkt für Safari, nehme ich mal an. ;)

                Finde ich immer noch, es gibt keinen Grund, Event-Handler nicht funktionstüchtig zu erstellen, auch wenn sie nur als DOM-Attribute definiert sind.

                Tim

      2. Hi,

        var elements = document.getElementsByTagName("*");

        Damit habe ich auch mal experimentiert, es aber wieder verworfen, da es AFAIR nicht mit jedem (DHTML-)Browser funktioniert hat.

        Gruß, Cybaer

        --
        Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
        1. var elements = document.getElementsByTagName("*");

          Damit habe ich auch mal experimentiert, es aber wieder verworfen, da es AFAIR nicht mit jedem (DHTML-)Browser funktioniert hat.

          soweit ich mich erinnere nur in den ersten Mozilla Versionen

          Struppi.

          1. Hi,

            Damit habe ich auch mal experimentiert, es aber wieder verworfen, da es AFAIR nicht mit jedem (DHTML-)Browser funktioniert hat.
            soweit ich mich erinnere nur in den ersten Mozilla Versionen

            Da erinnerst Du leider falsch. :-o

            Ich weiß nicht, was z.B. die alten Opera-Versionen dazu sagen (na ja, der kann DOM ja eigentlich auch ohnehin erst jetzt >;-> - hoffentlich), aber die IE 5.x können das ebenfalls nicht! :-(

            Und wozu inkompatibel werden und Fehler provozieren? Geht ja auch ohne ...

            ... tipp tipp ... ;-)

            ... z.B. so:

              
            <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">  
            <html>  
            <head>  
            <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">  
            <title>get IDs</title>  
            <script type="text/javascript">  
            function getIDs(obj) {  
             var recursive, id=false;  
             if(document.getElementById) {  
              id=new Array();  
              obj=(typeof(obj)=="object" && obj)?obj:document.getElementsByTagName("body")[0];  
              recursive=function(obj) {  
               for(var i=obj.firstChild; i!=null; i=i.nextSibling) {  
                if(i.nodeType==1) {  
                 idValue=i.getAttribute("id");  
                 if(idValue) { id[id.length]=idValue; }  
                 recursive(i);  
                }  
               }  
              }  
              recursive(obj);  
             }  
             return id;  
            }  
              
            function dumpArray(array,id) {  
             if(document.getElementById && document.getElementById(id) && array.length) {  
              var i, dump="<ol>";  
              for(i=0;i<array.length;i++) { dump+="<li>"+array[i]+"<\/li>"; }  
              dump+="<\/ol>";  
              document.getElementById(id).innerHTML=dump;  
             }  
            }  
              
            </script>  
            </head>  
              
            <body onload="dumpArray(getIDs(),'output');">  
              
            <div id="ID1"><span id="nextID">IDs</span>:  
              
            <div id="output"></div>  
            </div>  
              
            <div id="lastID"></div>  
              
            </body>  
            </html>  
            
            

            getIDs() gibt ein Array aller IDs des Dokumentes zurück, das mit dumpArray dann (in die Seite) ausgegeben wird. Man könnte getIDs() auch noch ein Objekt übergeben (hier z.B. document.getElementById('ID1')). Dann werden entsprechend nur die IDs ermittelt, die in diesem Zweig sind.

            Gruß, Cybaer (Verbesserungsvorschläge erwünscht, da die Routine nicht aus dem "getesteten Fundus" stammt)

            --
            Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
            1. Ich weiß nicht, was z.B. die alten Opera-Versionen dazu sagen (na ja, der kann DOM ja eigentlich auch ohnehin erst jetzt >;-> - hoffentlich), aber die IE 5.x können das ebenfalls nicht! :-(

              Den hab ich noch nie benutzt

              Und wozu inkompatibel werden und Fehler provozieren? Geht ja auch ohne ...

              Gruß, Cybaer (Verbesserungsvorschläge erwünscht, da die Routine nicht aus dem "getesteten Fundus" stammt)

              Wenn es wirklich nur um den IE 5 geht, warum dann nicht document.all (was dann auch Opera noch mitnimmt)?

              Struppi.

              1. Hi,

                aber die IE 5.x können das ebenfalls nicht! :-(
                Den hab ich noch nie benutzt

                *Die*! 5.0 und 5.5. Aber Anwender benutzen ihn - da kann man also schon mal dran denken. ;-)

                Wenn es wirklich nur um den IE 5 geht, warum dann nicht document.all (was dann auch Opera noch mitnimmt)?

                Weil das andere Browser nicht können? Meine Routine arbeitet browserübergreifend. Das sollte man von einer JS-Routine doch erwarten können, oder? =;-)

                Aber eine Verbesserung ist mir noch selbst aufgefallen:

                Da Opera erst ab 7 firstChild beherrscht (jedenfalls laut selfHTML ;-)), wäre es wohl rücksichtsvoll, dies zu berücksichtigen. Dann müßte es heißen:

                  
                  if(obj.firstChild) {  
                   id=new Array();  
                   recursive(obj);  
                  }  
                
                

                Also den Startaufruf umklammern und die Neudefinition von id als Array dort mit rein. Dann sollten ältere Operas ein FALSE zurückbekomen, selbst wenn sie getElementById schon kennen.

                Hoffe jedenfalls, daß alles berücksichtigt ist ...

                ... bis zum nächsten "da war doch noch was" ... ;->

                Gruß, Cybaer

                --
                Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
                1. aber die IE 5.x können das ebenfalls nicht! :-(
                  Den hab ich noch nie benutzt

                  *Die*! 5.0 und 5.5. Aber Anwender benutzen ihn - da kann man also schon mal dran denken. ;-)

                  Ich wollte damit nur sagen, dass ich mich damit nicht auskennen.

                  Wenn es wirklich nur um den IE 5 geht, warum dann nicht document.all (was dann auch Opera noch mitnimmt)?

                  Weil das andere Browser nicht können? Meine Routine arbeitet browserübergreifend. Das sollte man von einer JS-Routine doch erwarten können, oder? =;-)

                  Genau und mit documet.all würde das im IE 4 funtkioneren. document.getElement können auch nicht alle Browser.

                  Wenn du sagst, das nur der IE 5 nicht '*' kann, dann spricht doch nichts dagegen stattdessen document.all zu verwenden, was den Vorteil hätte das die Funktion auch im IE 4 funktioniert (den ich tatsächlich noch benutze)

                  Struppi.

                  1. Hi,

                    Genau und mit documet.all würde das im IE 4 funtkioneren. document.getElement können auch nicht alle Browser.

                    Aber letzteres gehört zum *standarisierten* DOM Level 2. Wer sich noch die Mühe machen möchte, die proprietären DOM Level 1 zu unterstützen, der darf das ja gerne machen. Aber ...

                    Wenn du sagst, das nur der IE 5 nicht '*' kann,

                    ... erstens habe ich das nicht gesagt. Vielmehr sagte ich, daß der IE 5.x das "*" auch nicht unterstützt. Ich habe keine Ahnung, ob und wenn ja welche DOM-Level-2-Browser es noch gibt (oder geben wird), die diese vermutliche Erweiterung des Standards ebenfalls nicht unterstützen (werden). Und zweitens ...

                    dann spricht doch nichts dagegen stattdessen document.all zu verwenden, was den Vorteil hätte das die Funktion auch im IE 4 funktioniert (den ich tatsächlich noch benutze)

                    ... ist es ist IMHO wenig sinnvoll, für eine wohl nicht standardisierte Ergänzung, die nicht jeder DOM-Level-2-Browser unterstützt, einen vollends proprietären DOM-Level-1-Workaround zu programmieren, in der unbestimmten *Hoffnung*, daß alle Browser zumindest eines von beiden beherrschen - zumal wenn eine standardkonforme Möglichkeit existiert! Proprietäre Techniken sollten im Zweifel stets *ergänzend* zum Standard verwendet werden, nicht anstelle des Standards. =:-o

                    Und es ist ja ein leichtes, die standardkonforme Routine dahingehend zu erweitern, daß sie "*" oder all verwendet, falls dies möglich ist. Tims Routine kann ja als Basis für die Ergänzung dienen.

                    Allerdings: Es ist ja kein Problem, alle Objekte der all-Collection abzuklappern. Aber hast Du eine Idee, wie ich es anstellen müßte, nur Objekte eines Zweiges auszuwerten?

                    D.h., wenn man getIDs(document.getElementById('ID1')) anfordert, ermittelt er ja nur die IDs innerhalb des Zweigs "ID1" (also "nextID" und "output" - "ID1" und "lastID" liegen ja außerhalb). Wie ginge das mit all?

                    Gruß, Cybaer

                    --
                    Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
                    1. Hallo Cybaer,

                      D.h., wenn man getIDs(document.getElementById('ID1')) anfordert, ermittelt er ja nur die IDs innerhalb des Zweigs "ID1" (also "nextID" und "output" - "ID1" und "lastID" liegen ja außerhalb). Wie ginge das mit all?

                      So wahrscheinlich:

                        
                      function getIDs () {  
                        for (i=0; i<document.all.length; i++ ) {  
                          if(document.all[i].id)  
                            alert(document.all[i].id);  
                        }  
                      }  
                        
                      window.onload=getIDs;  
                      
                      

                      Gruß Gernot

                      1. Hi,

                        So wahrscheinlich:

                        Ja, ich weiß, es ist noch früh morgens: Thema leider verfehlt! =;-)

                        for (i=0; i<document.all.length; i++ ) {
                            if(document.all[i].id)

                        Ich schrieb:

                        "Es ist ja kein Problem, alle Objekte der all-Collection abzuklappern."

                        Das entspricht dem obigen Code.

                        Die Frage war:

                        "Aber hast Du eine Idee, wie ich es anstellen müßte, nur Objekte eines Zweiges auszuwerten?"

                        Das bedeutet eben *nicht* alle Elemente der all-Collection durchzunudeln, sondern nur die, die man auch wirklich haben will (s. meine Variante von getIDs(), die das schon kann).

                        Gruß, Cybaer

                        --
                        Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
                        1. Hallo Cybaer,

                          Ja, ich weiß, es ist noch früh morgens: Thema leider verfehlt! =;-)

                          Ich werde langsam wach;
                          Dann eben so:

                            
                          function getIDs () {  
                            for (i=0; i<document.all['bod'].all.length ; i++ ) {  
                                alert(document.all['bod'].all[i].id);  
                            }  
                          }  
                            
                          window.onload=getIDs;  
                          
                          

                          Gruß Gernot

                          1. Moin,

                            Ich werde langsam wach;

                            :)

                            Dann eben so:

                            Jo, danke. :-) Das zeigt dann auch gleich das konzeptionelle Problem auf: Wie übergibt man das den Startpunkt browserübergreifend?

                            Wenn ich ihn als Objekt übergebe, dann muß ich ja auch eine Fallunterscheidung bei der Übergabe machen (das muß ich ja auch kompatibel ermitteln). Wäre es also sinnvoll, eine ID als Startpunkt zu übergeben und falls diese nicht übergeben wird, als Defaulteinstellung den BODY komplett zu nehmen?

                            Aber dann müßte man ja auch noch alle entsprechende Objekte der all-Collection durchgehen und auf deren ID überpüfen. Denn IIRC (ich programmiere so selten mit dem IE-DOM - vorsichtig formuliert ;-)) könnte document.all["start"] ja sowohl auf id="start" als auch beliebige name="start" verweisen (halt mit einer neuen Collection als Ergebnis).

                            Und der Default-Startpunkt als Tag wär wiederum universeller nicht mit document.body, sondern mit document["body"] festzulegen, falls man die Suche z.B. auf das ganze Dokument ausdehnen oder auf Tags beschränken möchte. Denn eigentlich habe ich nicht im Hinterkopf eine Auflistung der IDs, sondern beliebiger Attribute, also z.B. auch SRC oder HREF - na ja, eigentlich ist die Funktion schon fertig, aber eben ohne document.all.

                            Da scheint mir die adäquate Unterstützung des proprietären DOMs doch in umfangreiche Arbeit auszuarten ... =:-/

                            Gruß, Cybaer

                            --
                            Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
                            1. Hallo Cybaer,

                              Jo, danke. :-) Das zeigt dann auch gleich das konzeptionelle Problem auf: Wie übergibt man das den Startpunkt browserübergreifend?

                              Nicht nur ein konzeptionelles Problem, auch ein technisches: Habe bei meinen Tests wieder mal festgestellt, dass Opera 7.54 viel besser mit dem All-Objekt umgehen kann als der IE6.

                              Der IE6 (wahrscheinlich auch die früheren Versionen) streikt nämlich total, bei dem Versuch, mit all auf alle Elemente eines übergebenen Objekts zuzugreifen, während Opera da wie gesagt gar keine Probleme hat.

                                
                              <html>  
                              <head>  
                              <title>allIDs eines Teilzweiges</title>  
                              <script language="JavaScript">  
                              [code lang=javascript]  
                              function getIDs (x) {  
                                alert(x.id);  
                                for (i=0; i<x.all.length ; i++ ) {  
                                    alert(x.all[i].id);  
                                }  
                              }  
                              
                              

                              </script>
                              </head>
                              <body id="bod" onLoad="getIDs(this)">
                                <div id="div1">&nbsp;</div>
                                <div id="div2">&nbsp;</div>
                              </body>
                              </html>
                              [/code]

                              Gruß Gernot

                              1. Hi,

                                Der IE6 (wahrscheinlich auch die früheren Versionen) streikt nämlich total,

                                Also im IE 5.5 klappt es.

                                Aber dann könnte man sowieso nicht einfach auf document.all prüfen, wenn der IE 6 da Probleme bereitet. =:-o

                                Aber ich gebe es soweit dran. Wahrscheinlich werde ich noch das "*" einbauen für die Browser, die es beherrschen, und die, die weder "*" noch DOM Level 2 ohne "*" verstehen, bleiben erstmal außen vor ...

                                Gruß, Cybaer

                                --
                                Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
                                1. Der IE6 (wahrscheinlich auch die früheren Versionen) streikt nämlich total,

                                  Also im IE 5.5 klappt es.

                                  Aber dann könnte man sowieso nicht einfach auf document.all prüfen, wenn der IE 6 da Probleme bereitet. =:-o

                                  Wieso?

                                  var all = document.getElementsByTagName('*');
                                  if(all) // oder typeof... - keine Ahnung was der IE 5 da zurückgibt
                                  {
                                      ...
                                  }
                                  else if(document.all)
                                  {
                                     // Zweig für IE < 6
                                  }

                                  Aber ich gebe es soweit dran. Wahrscheinlich werde ich noch das "*" einbauen für die Browser, die es beherrschen, und die, die weder "*" noch DOM Level 2 ohne "*" verstehen, bleiben erstmal außen vor ...

                                  Letztlich ist die Frage, was diese Funktion leisten soll, bzw. wofür das Ergebnis verwendet wird.

                                  Da selbst der IE 4 eigentlich relativ viel kann sollte zumindest der document.all Zweig in erwägung gezogen werden, zumal du - wie auch hier - gerne auf breite Browserunerstützung pochst.

                                  Struppi.

                                  1. Hallo Ihr drei,

                                    Letztlich ist die Frage, was diese Funktion leisten soll, bzw. wofür das Ergebnis verwendet wird.

                                    Ich wollte nur mal anmerken, daß es schön ist, daß ihr meine dahingerotzte Funktion so auf Schwachstellen abklopft, es ist selten geworden, daß das Forum zum wirklichen Diskutieren und Weiterentwickeln und nicht nur zum Fragen und Antworten benutzt wird.

                                    Hat jemand Lust, die Funktion zusammenzufassen und einen Kurzartikel daraus zu machen? Muß nicht lang sein, nur endgültige, in den meisten Browsern funktionierende Funktion und Erklärung. Würde sich doch anbieten.

                                    Tim

                                    1. Hi,

                                      Hat jemand Lust, die Funktion zusammenzufassen und einen Kurzartikel daraus zu machen? Muß nicht lang sein, nur endgültige, in den meisten Browsern funktionierende Funktion und Erklärung. Würde sich doch anbieten.

                                      Hier erstmal mein letzter Stand für alle DOM-Level-2-Browser mit Kommentaren. Auf jeden Fall erscheint es mir noch sinnvoll, die Ermittlung des Startobjekts noch in der Funktion selber zu erledigen (also ggf. ID übergeben, und damit das Startobjekt ermitteln), anstatt ein Objekt selbst zu übergeben. Ob noch die proprietäre all-Variante reinkommt: mal sehen. Wenn ja, dann auch noch die "*"-Variante. Letztere kann zwar nichts "mehr", dürfte aber prinzipiell schneller sein, als eine JS-Rekursion.

                                        
                                      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">  
                                      <html>  
                                      <head>  
                                      <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">  
                                      <title>Ermittle Attribut-Werte</title>  
                                      <script type="text/javascript"><!--  
                                      // Alle IDs ermitteln 050414  
                                      function getAttributeValues(attribName,startObj) {  
                                       // Lokale Variablen, attribute ist FALSE  
                                       var recursive, attribute=false;  
                                       // Funktion ueberhaupt moeglich?  
                                       if(attribName && document.getElementById) {  
                                        // Ist der ggf. uebergebene Parameter ein Objekt? Existiert es? Hat es einen Node-Namen? Wenn nicht: Das ganze Dokument  
                                        startObj=(typeof(startObj)=="object" && startObj && startObj.nodeType==1)?startObj:document.getElementsByTagName("body")[0];  
                                        // Rekursive Funktion fuer den DOM-Baum definieren  
                                        recursive=function(attribName,obj) {  
                                         // Durch den Baum hangeln  
                                         for(var i=obj.firstChild; i!=null; i=i.nextSibling) {  
                                          // Wenn Objekt ein Elementknoten ...  
                                          if(i.nodeType==1) {  
                                           // ... Attribut auslesen ...  
                                           attribValue=i.getAttribute(attribName);  
                                           // ... und sichern, falls es das Attribut gab und einen Wert hatte  
                                           if(attribValue) { attribute[attribute.length]=attribValue; }  
                                           // Weiter geht's  
                                           recursive(attribName,i);  
                                          }  
                                         }  
                                        }  
                                        // Start der Suche, falls der Browser firstChild kennt  
                                        if(startObj.firstChild) {  
                                         // attribute als Array definieren  
                                         attribute=new Array();  
                                         // Los geht's  
                                         recursive(attribName,startObj);  
                                        }  
                                       }  
                                       // Rueckgabe des Arrays oder von FALSE, falls der Browser zu alt ist  
                                       return attribute;  
                                      }  
                                        
                                      // Array per DHTML ausgeben 050414  
                                      function dumpArray(array,id) {  
                                       // Ist die Ausgabe moeglich, existiert der Ausgabebereich und hat das Array Inhalt?  
                                       if(document.getElementById && document.getElementById(id) && array.length) {  
                                        // Lokale Variablen, dump mit Listen-Tag vordefinieren  
                                        var i, dump="<ol>";  
                                        // Array durchlaufen und dump ergaenzen  
                                        for(i=0;i<array.length;i++) { dump+="<li>"+array[i]+"<\/li>"; }  
                                        // Abschluss mit dem Tag-Ende  
                                        dump+="<\/ol>";  
                                        // Liste in das Dokument schreiben  
                                        document.getElementById(id).innerHTML=dump;  
                                       }  
                                      }  
                                        
                                      //--></script>  
                                      </head>  
                                        
                                      <body onload="dumpArray(getAttributeValues('id'),'output');">  
                                        
                                      <div id="ID1"><span id="nextID">IDs</span>:  
                                        
                                      <div id="output"></div>  
                                      </div>  
                                        
                                      <div id="lastID"></div>  
                                        
                                      </body>  
                                      </html>  
                                      
                                      

                                      Gruß, Cybaer

                                      --
                                      Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
                                  2. Hi,

                                    var all = document.getElementsByTagName('*');
                                    if(all) // oder typeof... - keine Ahnung was der IE 5 da zurückgibt
                                    {
                                        ...
                                    }
                                    else if(document.all)
                                    {
                                       // Zweig für IE < 6
                                    }

                                    Hmm ja, so rum klingt es vernünftig. ;-)

                                    Letztlich ist die Frage, was diese Funktion leisten soll, bzw. wofür das Ergebnis verwendet wird.

                                    Nicht nur für IDs ... ;-)

                                    Da selbst der IE 4 eigentlich relativ viel kann sollte zumindest der document.all Zweig in erwägung gezogen werden, zumal du - wie auch hier - gerne auf breite Browserunerstützung pochst.

                                    Na ja, JS ist bei mir halt immer optional - kaum ein Muß. Und mir ist wichtig, daß die Einbindung keine Fehler wirft. Nicht, daß alle alten Versionen möglichst alles können. DOM Level 2 ist für mich eine "natürliche Grenze". Nur sollten ältere Browser halt trotzdem noch den Normalkram abarbeiten können, auch wenn sie so ein Script zur Bearbeitung kriegen. ;-))

                                    Aber ich erwäge. ;-) Was allerdings auch eine Zeitfrage ist. Und mom. ... =:-)

                                    Gruß, Cybaer

                                    --
                                    Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
                    2. Hi,

                      für eine wohl nicht standardisierte Ergänzung,

                      Das beziehst Du doch auf das getElementsByTagName("*"), oder?

                      Falls ja: http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-A6C9094 sagt:

                      getElementsByTagName
                          Returns a NodeList of all the Elements with a given tag name in the order in which they are encountered in a preorder traversal of the Document tree.
                          Parameters

                      tagname of type DOMString
                              The name of the tag to match on. The special value "*" matches all tags.

                      Das ist also durchaus standardisiert.

                      cu,
                      Andreas

                      --
                      Warum nennt sich Andreas hier MudGuard?
                      Schreinerei Waechter
                      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
                      1. Hi,

                        Das ist also durchaus standardisiert.

                        Oh fein! :-)) Hast Du Kenntnis, warum das anfangs nicht konsequent implementiert wurde?

                        Gruß, Cybaer

                        --
                        Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
  2. gibt es eine einfache möglichkeit, alle definierten ids einer html seite auszulesen?

    Wozu?

    Struppi.

    1. Hallo.

      gibt es eine einfache möglichkeit, alle definierten ids einer html seite auszulesen?

      Wozu?

      Weil eine komplizierte Möglichkeit zu kompliziert wäre.
      MfG, at