140 votes

JavaScript obtient un élément par son nom

Considérons cette fonction :

function validate()
{
  var acc = document.getElementsByName('acc').value;
  var pass = document.getElementsByName('pass').value;

  alert (acc);
}

Et cette partie HTML :

<table border="0" cellpadding="2" cellspacing="0" valign="top">
    <tr>
        <td class="td1">Account</td>
        <td class="td2"><input type="text" name="acc" /></td>
    </tr>
    <tr class="td1">
        <td>Password</td>
        <td class="td2"><input type="password" name="pass" /></td>
    </tr>
</table>
<div><button onClick="validate()" class="cupid-greenx">Login now</button></div>

La boîte d'alerte s'affiche, mais elle indique "undefined".

0 votes

Si vous pouvez le modifier entièrement, je vous recommanderais d'ajouter un champ "id" à vos deux champs de saisie, et d'utiliser la méthode suivante document.getElementById qui renvoie exactement une valeur.

4 votes

Encore mieux : var inputs = document.getElementsByTagName('input') retourne une liste de nœuds, à partir de laquelle vous pouvez extraire les deux éléments comme suit : var pass = inputs.item('pass'). Juste un conseil, cela peut accélérer les choses si vous avez affaire à un DOM important, car getElementById va chercher l'arbre entier à chaque fois, alors qu'une liste de noeuds ne le fera pas, donc c'est plus rapide...

0 votes

Petit code mignon en effet XD

275voto

Aidanc Points 3485

La raison pour laquelle vous voyez cette erreur est que document.getElementsByName renvoie un NodeList d'éléments. Et un NodeList d'éléments n'a pas de .value propriété.

Utilisez ceci à la place :

document.getElementsByName("acc")[0].value

32voto

Ozzy Points 4358

Notez le pluriel dans cette méthode :

document.getElementsByName()

Cela renvoie un tableau d'éléments, utilisez donc [0] pour obtenir la première occurrence, par exemple

document.getElementsByName()[0]

8 votes

Ce n'est pas un tableau, c'est une NodeList :-)

1 votes

@FlorianMargaine - En fait, c'est un HTMLCollection ;)

1 votes

@j08691 non, :) mais il peut être facile d'être confus :p

13voto

Elliot Bonneville Points 18141

Tu veux ça :

function validate() {
    var acc = document.getElementsByName('acc')[0].value;
    var pass = document.getElementsByName('pass')[0].value;

    alert (acc);
}

0 votes

Merci d'avoir utilisé l'exemple du PO dans votre réponse.

0 votes

@KrisBoyd, la différence est que je récupère le premier élément du tableau retourné par getElementsByName . J'aurais peut-être dû être plus clair. N'hésitez pas à le modifier si vous le souhaitez.

0 votes

Je vous donnais un complément :) aucune des réponses supérieures ne le forme dans le même format que l'OP.

7voto

dalazx Points 51

La méthode document.getElementsByName renvoie un tableau d'éléments. Vous devez sélectionner le premier, par exemple.

document.getElementsByName('acc')[0].value

4 votes

Ce n'est pas un tableau, c'est une NodeList :-)

6voto

Sam Battat Points 1861
document.getElementsByName("myInput")[0].value;

1 votes

Pour être clair : il s'agit de récupérer un élément d'une NodeList. :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X