Niveau
..........
En rapport...

Les collections

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 :

javascript
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…

Un prototype pour le concat

Afin de pouvoir faire un concat, on va prototyper les objects et rajouter la méthode concat :

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;
}

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.

Si vous appelez la mathode en ne lui passant aucun paramètre, vous obtiendrez en retour votre collection convertie en Array().

Exemple

Vous pouvez tester ceci :

html4strict
<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 -

iDo –