11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour,
je voudrai récupérer les enfants (petits fils) d'un noeud qui est le dernier enfant d' un grand parent.

j' ai ce code mais le nombre des petits fils que j' obtiens (toujours 1) n' est pas correcte.

je ne sais pas où ce trouve l' erreur dans mon code.
voici le code:

var parent2 = Array();
			
			function liste_petits_fils(element){
        current = element ;
				var parent = element.parentNode;
			
				
				
				
								for(i=0; i < parent.childNodes.length;i++){
									 
								   parent2[i] = parent.childNodes[i];	
							  }
			  

		
								for(i=0;i<parent2.length;i++){
									
									    var last_fils = parent2[i].lastChild;
									
										
										  for(j=0;j<last_fils.childNodes.length;j++){
										  	
										      alert('nbre fils'+last_fils.childNodes.length);
										      
									    }
									    
									}
			
		}

ce code permet de récupérer pour chaque enfant de premier profondeur la liste des enfants de son dernier enfant.

merci d' avance.[/i][/i][/i]
Salut,

Perso, je ne comprends pas ta question :
1) les "enfants (petits fils)", ça veut dire quoi ? Tu veux les enfants ou les petits-enfants ?
2) "un noeud qui est le dernier enfant d' un grand parent." Pareil, je vois pas vraiment...

En, tout cas il y a au moins un erreur là dans ton code :
for(i=0;i<parent2.length;i++){
parent2 est un élément, pas une liste d'éléments. Il n'a donc pas de propriété length, et tu ne peux pas boucler dessus.
merci,
la situation se présente comme suit :cette situation:

<div id="container"><!-- debut container -->
<div id="parent"><!-- debut parent -->

       <div id="fils_1"><!-- debut fils_1  -->
       </div><!-- fin fils_1  -->

       <div id="fils_2"><!-- debut fils_2  -->
               <div id="petits_fils_1"></div>
               <div id="petits_fils_1"></div>
               <div id="petits_fils_1"></div>
               <div id="petits_fils_1"></div>
               <div id="petits_fils_1"></div>
               <div id="petits_fils_1"></div>

       </div><!-- fin fils_2  -->

</div><!-- fin parent -->

<div id="parent"><!-- debut parent -->

       <div id="fils_1"><!-- debut fils_1  -->
       </div><!-- fin fils_1  -->

       <div id="fils_2"><!-- debut fils_2  -->
               <div id="petits_fils_1"></div>
               <div id="petits_fils_1"></div>
               <div id="petits_fils_1"></div>
               <div id="petits_fils_1"></div>
               <div id="petits_fils_1"></div>
               <div id="petits_fils_1"></div>

       </div><!-- fin fils_2  -->

</div><!-- fin parent -->

</div><!-- fin container -->



donc à partir du noeud



container

je voudrai récuperer tous les noeuds


petits_fils_1


par rapport à ta remarque :

En, tout cas il y a au moins un erreur là dans ton code :

for(i=0;i<parent2.length;i++){

parent2 est un élément, pas une liste d'éléments. Il n'a donc pas de propriété length, et tu ne peux pas boucler dessus.



parent2

est un tableau car :


var parent2 = Array();
		
			function liste_petits_fils(element){

                               current = element ;
			       var parent = element.parentNode;

				for(i=0; i < parent.childNodes.length;i++){
                                            parent2 = parent.childNodes[i];	
                                 }

			  




[/i]
a écrit :
parent2 est un tableau car [...] parent2 = parent.childNodes;
Dans ton premier post, parent2 n'était pas un tableau car tu faisais :
a écrit :
parent2 = parent.childNodes[i];

En ce qui concerne ton problème, qui est maintenant beaucoup plus clair, ce qu'il te faut c'est une fonction récursive de ce style :
function getChildren(element, depth) {
    // on déclare une variable pour contenir la liste des résultats
    var r = r || [];
    // on boucle sur les enfants de l'élément
    for (var i=0, l=element.childNodes.length; i<l; i++) {
        var child = element.childNodes[i[#000]];
        if (child.nodeType == 1) {
            // si on est au bon niveau de profondeur, on ajoute aux résultats
            if (depth === 1) {
                r.push(child);
            } // sinon on descend plus profond
            else {
                r = r.concat(getChildren(child, depth - 1));
            }
        }
    }
    // on retourne la liste des résultats
    return r;
}
Le premier argument de la fonction est l'élément de référence.
Le second argument c'est le niveau de profondeur des éléments que tu souhaites récupérer (par rapport à l'élément passé en premier argument).

Donc dans ton cas et avec le code HTML que tu as donné, il te suffira d'un simple :
var petits_fils = getChildren(document.getElementById('container'), 3);

Modifié par marcv (16 Apr 2009 - 18:06)