2010-12-13 44 views
0

J'ai construit une fonction prototype pour Arrays et elle ne me permet pas de l'utiliser avec un tableau de document.forms [0] .elements. Voici un script simplifié qui montre ce problèmeLa fonction Array.prototype ne fonctionne pas pour document.forms [0] .elements

<html> 
<body> 

<form id="frm1" action="form_action.asp"> 
    First name: <input type="text" name="fname" value="Donald" /><br /> 
    Last name: <input type="text" name="lname" value="Duck" /><br /> 
    <input type="submit" value="Submit" /> 
</form> 


<p>Return the value of each element in the form:</p> 
<script type="text/javascript"> 
Array.prototype.returnFirst = function(){ 
    return this[0]; 
} 
alert([1,2,3].returnFirst()); //Why does this work? 
alert(document.forms[0].elements.returnFirst().id); //but this one doesn't? 
</script> 

</body> 
</html> 

Vous verrez ce que la fonction prototype returnFirst() fonctionne pour mon tableau [1,2,3] mais pas pour mon tableau d'éléments? Pourquoi est-ce, c'est toujours un tableau?

Répondre

1

Ce n'est pas un tableau réel, donc il n'hérite pas Array.prototype.

Il s'agit en fait d'un HTMLCollection, comme vous pouvez le découvrir en appelant le toString() dessus. Si vous le souhaitez, vous pouvez modifier HTMLCollection.prototype, mais modifying DOM prototypes is discouraged.

EDIT:

Vous pouvez le transformer en un véritable tableau en appelant

var arr = Array.prototype.slice.call(document.forms[0].elements); 
+0

Ok, merci. Cela l'éclaircit. Je viens de juste le transformer en un tableau comme suit (cela semble fonctionner, mais je ne suis pas sûr si cela est conseillé) var elems = document.forms [0] .elements; //alert(elems.returnFirst().name); var newArr = new Array(); var i = elems.length; while (i -) { newArr.push (elems [i]); } newArr.reverse(); alerte (newArr.returnFirst(). Nom); –

+0

@Emdiesse: Voir mes modifications. – SLaks