Andreas_Gast: Elemente eines DOM-Nodes zählen

Hallo ich habe ein kleine Problem mit einer rekursiven Funktion, welche alle Elemente eines DOM-Nodes zählen soll. Es wird eine das DOM-Element und ein counter übergen. Der Counter soll später die Anzahl der Elemente enthalten. Es währe super wenn mir jemand sagt und erklärt was ich falsch gemacht habe.

Gruß Andreas

  
var count=0;  
countDOM(document.getElementById('body'),count);  
alert(count);  
  
  
function countDOM(ele,count){	  
	var temp=ele;	  
	count=count+temp.childNodes.length;	  
	if(temp.hasChildNodes()){  
		for(var i=0;i<temp.childNodes.length;i++){  
			countDOM(temp.childNodes[i],count);  
		}  
	}  
}  

  1. Hi,

    Hallo ich habe ein kleine Problem mit einer rekursiven Funktion, welche alle Elemente eines DOM-Nodes zählen soll. Es wird eine das DOM-Element und ein counter übergen. Der Counter soll später die Anzahl der Elemente enthalten. Es währe super wenn mir jemand sagt und erklärt was ich falsch gemacht habe.

    Es wäre super, wenn du uns erst mal erklärst, was daran denn nicht so läuft, wie du es erwartet hast.

    var count=0;

    countDOM(document.getElementById('body'),count);
    alert(count);

      
    Ich vermute, der Fehler liegt darin, dass du count als Parameter an die Funktion übergibst - und damit innerhalb dieser eine lokale Variable erzeugst, deren Wertzuweisung den Wert der globalen Variablen nicht beeinflusst, so dass du am Ende immer noch 0 herausbekommst.  
      
    MfG ChrisB  
      
    
    -- 
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    
  2. @@Andreas_Gast:

    welche alle Elemente eines DOM-Nodes zählen soll.

    Dann solltest du nicht alle Kindknoten, sonden nur diejenigen zählen, die http://de.selfhtml.org/javascript/objekte/node.htm#node_type@title=Elementknoten sind.

    Live long and prosper,
    Gunnar

    --
    Das einzige Mittel, den Irrtum zu vermeiden, ist die Unwissenheit. (Jean-Jacques Rousseau)
  3. ich habe ein kleine Problem mit einer rekursiven Funktion, welche alle Elemente eines DOM-Nodes zählen soll.

    Dazu brauchst du keine Rekursion, das geht einfach mit

    function countChildElements (el) {  
       return el.getElementsByTagName('*').length;  
    }  
      
    alert(countChildElements(document.body));
    

    Wenn du tatsächliche alle Nachfahrenelemente meinst.

    Mathias

    1. [latex]Mae  govannen![/latex]

      return el.getElementsByTagName('*').length;

      Tss tss.. wer wird denn den armen "Der Martin" auschließen ;)

      (Für diejenigen, die damit nichts anfangen können: getElementsByTagName('*') funktioniert „erst“ ab IE 6)

      Cü,

      Kai

      --
      „It's 106 miles to Chicago, we got a full tank of gas, half a pack of cigarettes, it's dark, and we're wearing sunglasses“.
      „Hit it!“
      Selfzeugs
      SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
      1. Hallo,

        »»    return el.getElementsByTagName('*').length;
        Tss tss.. wer wird denn den armen "Der Martin" auschließen ;)

        danke für deine Solidarität, aber ...

        (Für diejenigen, die damit nichts anfangen können: getElementsByTagName('*') funktioniert „erst“ ab IE 6)

        ... Javascript ist für meine Browser sowieso etwas ganz Seltenes, egal ob sie nun gerade Internet Explorer, Opera oder, wenn's nicht anders geht, sogar mal Firefox heißen.  :-)

        Ciao,
         Martin

        --
        There are 10 types of people in the world: Those who understand the binary system, and those who don't.
  4. So hab das Problem wie folgt lösen können. Ich gebe nun die Anzahl mit einem return zurück.

      
    var anzahl_elemente=countDOM_call(document.getElementById('body'),0);  
    alert(anzahl_elemente)  
      
    	function countDOM_call(ele,p_count){	  
    		var temp=ele;	  
    		count=temp.childNodes.length;		  
    		if(temp.hasChildNodes()){  
    			for(var i=0;i<temp.childNodes.length;i++){  
    				count+=countDOM_call(temp.childNodes[i]);  
    			}  
    		}  
    		return count;  
    	}  
      
    
    
    1. var anzahl_elemente=countDOM_call(document.getElementById('body'),0);

      alert(anzahl_elemente)

      function countDOM_call(ele,p_count){
      var temp=ele;
      count=temp.childNodes.length;
      if(temp.hasChildNodes()){
      for(var i=0;i<temp.childNodes.length;i++){
      count+=countDOM_call(temp.childNodes[i]);
      }
      }
      return count;
      }

        
      Ein paar Tipps:  
      Falls getElementById('body') das body-Element anspricht: Das body-Element kannst du über document.body ansprechen, eine ID ist nicht nötig.  
      Was macht die Variable p\_count? Sie wird nicht benutzt.  
      Warum kopierst du ele in die Variable temp? Du kannst auch gleich die Variable ele verwenden.  
      Warum ist die Variable count global? Das muss und sollte sie nicht.  
      Der zusätzliche Aufruf von hasChildNodes ist unnötig, weil du bereits zuvon die Länge in Erfahrung gebracht hast.  
      In der Schleife solltest du nicht immer wieder temp.childNodes.length notieren, das verlangsamt die Geschichte sehr.  
        
      ~~~javascript
      alert(countDescendantNodes(document.body));  
        
      function countDescendantNodes (el) {  
      	var childNodesLength = el.childNodes.length,  
      		sum = childNodesLength;  
      	if (childNodesLength > 0) {  
      		for (var i = 0; i < childNodesLength; i++) {  
      			sum += arguments.callee(el.childNodes[i]);  
      		}  
      	}  
      	return sum;  
      }
      

      (für IE 5.5 geeignet ;-))

      Wenn man das performanter braucht, könnte man übrigens mit TreeWalkern oder NodeIteratorn arbeiten.

      Mathias

      1. Hi,

        Der zusätzliche Aufruf von hasChildNodes ist unnötig, weil du bereits zuvon die Länge in Erfahrung gebracht hast.

        Das If vor der For-Schleife in deinem Vorschlag dann aber sogesehen auch - denn die For-Schleife läuft auch nicht weit, wenn die Bedingung gleich zu Anfang 0 < 0 lautet.

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
        1. die For-Schleife läuft auch nicht weit, wenn die Bedingung gleich zu Anfang 0 < 0 lautet.

          Stimmt. Was wäre ich nur ohne deine hilfreichen Hinweise!

          Mathias

          1. Hi,

            Stimmt. Was wäre ich nur ohne deine hilfreichen Hinweise!

            Lese ich da etwas Ironie heraus?

            MfG ChrisB

            --
            Light travels faster than sound - that's why most people appear bright until you hear them speak.
            1. Lese ich da etwas Ironie heraus?

              Nö, das meine ich ganz ernst.

              Mathias