endlosschleife in tree
waldemar
- javascript
0 Struppi
Hallo,
Ich habe ein skript geschrieben, welches eine einfache Baumstruktur beschreibt. Da ich HTMLelemente mit Baumelementen verknüpfen möchte, dachte ich mir, ich gebe den Baumelementen zusätzlich eine id, die dann auch die HTMLelemente halten können und nach der ich den Baum einfach durchsuchen kann. Dazu benutze ich die Methode get(id).. nur läuft die Methode aus mir nicht ersichtlichen Gründen in eine Endlosschleife und mein Browser bietet mir freundlicherweise noch an, das Skript zu beenden. Kann mir jemand helfen? Hier die Seite:
<html><head><title>tree</title>
<script language="javascript">
function treeNode( name, id ) {
this.id = id;
this.name = name;
this.depth = 0;
this.expanded = false;
this.children = Array();
this.size = function() {
return this.children.length;
}
this.add = function( treenode ) {
treenode.depth = this.depth + 1;
this.children[ this.size() ] = treenode;
}
this.get = function( id ) {
r = null;
if( this.id == id ) {
r = this;
} else {
for( i=0; (i<this.children.length && r==null); i++ ) {
r = this.childAt(i).get(id);
}
}
return r;
}
this.childAt = function( i ) {
if( i<this.size() ) {
return this.children[i];
} else {
return null;
}
}
}
function treetest() {
root = new treeNode( "root", 0 );
root.add( new treeNode( "eins", 1 ));
root.add( new treeNode( "zwei", 2 ));
root.get( 2 ).add( new treeNode( "einsSub1", 3 ));
root.get( 2 ).add( new treeNode( "einsSub2", 4 ));
root.get( 4 ).add( new treeNode( "einsSub1Sub1", 5 ));
root.add( new treeNode( "drei", 6 ));
root.add( new treeNode( "vier", 7 ));
alert( root.get( 5 ).name ); // funktioniert
alert( root.get( 6 ).name ); // endlosschleife
}
</script>
</head>
<body onload="treetest()">
</body></html>
Ich habe ein skript geschrieben, welches eine einfache Baumstruktur beschreibt. Da ich HTMLelemente mit Baumelementen verknüpfen möchte, dachte ich mir, ich gebe den Baumelementen zusätzlich eine id, die dann auch die HTMLelemente halten können und nach der ich den Baum einfach durchsuchen kann. Dazu benutze ich die Methode get(id).. nur läuft die Methode aus mir nicht ersichtlichen Gründen in eine Endlosschleife und mein Browser bietet mir freundlicherweise noch an, das Skript zu beenden. Kann mir jemand helfen? Hier die Seite:
<html><head><title>tree</title>
<script language="javascript">
Da fehlt das Type Attribut
this.get = function( id ) {
r = null;
if( this.id == id ) {
r = this;
} else {
for( i=0; (i<this.children.length && r==null); i++ ) {
r = this.childAt(i).get(id);
}
}
return r;
}
Was mir hier auffällt ist, das du ein globales i verwendest. Globale Variablen sollte man soweiso vermeiden da es zu Dingen führen kann die du nicht willst.
Außerdem gibt deine Funktion childAt auch null zurück, von daher solltest du erst prüfen ob der Wert gültig ist.
die Funktion get kann man auch übersichtlicher machen:
this.get = function( id ) {
if(typeof id == 'undefined') return null;
for( var i = 0; ( i < this.children.length;i++ ) {
var r = this.childAt(i);
if(r.id == id) return r;
}
return null;
}
ob zufälligerweise this gleich dem gesuchten Knoten ist, sollte man IMHO vernachlässigen.
this.childAt = function( i ) {
if( i<this.size() ) {
return this.children[i];
} else {
return null;
}
}
}
auch das würde ich anders machen, da der Paramter i nicht nur eine Zahl sein kann oder aber eine negative Zahl.
this.childAt = function( i ) {
if(typeof this.children[i] == 'undefined') return null;
return this.children[i]
}
Keine Ahnung ob es daran liegt.
Struppi.