Lors de l'appel à getElementsByTagName, on ne récupère pas un tableau mais une collection d'objets.
Le meilleur moyen de s'en persuader est de tester ceci :
var v=document.getElementsByTagName("body"); alert (typeof v);
Ceci affichera “object” et non pas “array”. Du coup, on ne peu ni faire de concat(), ni faire du push(), etc…
Afin de pouvoir faire un concat, on va prototyper les objects et rajouter la méthode concat :
Object.prototype.concat = function() { var r=new Array(); for (var i in this) { if (typeof this[i] =="object") r.push(this[i]); } for (a=0;a<arguments.length;a++) { if ((typeof arguments[a] !="object") && (typeof arguments[a] !="array")) continue; for (var i in arguments[a]) { if (typeof arguments[a][i] =="object") r.push(arguments[a][i]); } } return r; }
Tout comme la méthode concat() des Array, vous pouvez passer en paramètre autant de tableaux que vous le souhaitez.
Cette méthode ne modifie pas directement le tableau d'origine mais renvoie un tableau issue de la concaténation.
Vous pouvez tester ceci :
<div>sss</div> <div>sss</div> <div>sss</div> <span>eee</span> <span>eee</span> <span>eee</span> <span>eee</span> <script type="text/javascript"> Object.prototype.concat = function() { var r=new Array(); for (var i in this) { if (typeof this[i] =="object") r.push(this[i]); } for (a=0;a<arguments.length;a++) { if ((typeof arguments[a] !="object") && (typeof arguments[a] !="array")) continue; for (var i in arguments[a]) { if (typeof arguments[a][i] =="object") r.push(arguments[a][i]); } } return r; } var t=document.getElementsByTagName("div"); var u=document.getElementsByTagName("span"); var v=document.getElementsByTagName("body"); var tt=t.concat(u,v); alert(tt.length); </script>
12/03/2007 09:20 -
Discussion