JavaScript pobierz element po nazwie


127

Rozważ tę funkcję:

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

  alert (acc);
}

A ta część 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>

Okno alertu jest wyświetlane, ale pokazuje „niezdefiniowane”.


Jeśli możesz to całkowicie zmienić, polecam dodanie pola „id” do dwóch pól wejściowych i użycie document.getElementById, które zwraca dokładnie jedną wartość.
Odi

4
jeszcze lepiej var inputs = document.getElementsByTagName('input'):, zwraca listę węzłów, z której można wyodrębnić oba elementy, w ten sposób: var pass = inputs.item ('pass'). Właśnie cynk, prędkość ta może rzeczy w górę, jeśli masz do czynienia z dużym DOM, jak getElementByIdprzeszuka całe drzewo za każdym razem, podczas gdy liście węzłów nie będzie, więc to szybciej ...
Elias Van Ootegem

Rzeczywiście mały słodki kod XD
Guillermo Gutiérrez

Odpowiedzi:


246

Powodem, dla którego widzisz ten błąd, jest to, że document.getElementsByNamezwraca a NodeListz elementów. A NodeListz elementów nie ma .valuewłaściwości.

Użyj tego zamiast tego:

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

30

Zwróć uwagę na liczbę mnogą w tej metodzie:

document.getElementsByName()

To zwraca tablicę elementów, więc użyj [0], aby uzyskać pierwsze wystąpienie, np

document.getElementsByName()[0]

8
To nie jest tablica, to NodeList :-)
Florian Margaine

1
@FlorianMargaine - Właściwie to HTMLCollection ;)
j08691

1
@ j08691 nope :) ale może być łatwo mylić: P
Florian margaine

Jaka jest definicja tablicy i czym się ona różni? NodeList to po prostu obiekt zawinięty wokół tablicy HTMLElements przy użyciu kilku wygodnych metod. W każdym razie, ujmując to w kategoriach laika dla PO, powiedziałem tablica.
Ozzy

1
Tablica ma znacznie więcej metod niż lista NodeList. NodeList wykonuje niektóre metody / właściwości z tablic, takich jak lengthnieruchomości, ale również brakuje wiele metod, takich jak map, forEachitp co wyjaśnia, dlaczego musimy użyć: Array.prototype.forEach.call( NodeList, fn ).
Florian Margaine

11

Chcesz to:

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

    alert (acc);
}

Dziękujemy za skorzystanie z przykładu PO w odpowiedzi.
Kris Boyd

@KrisBoyd, różnica polega na tym, że otrzymuję pierwszy element z tablicy zwróconej przez getElementsByName. Może powinienem był to wyjaśnić - jeśli chcesz, możesz edytować.
Elliot Bonneville

Dałem ci uzupełnienie :) żadna z wyższych odpowiedzi nie formuje tego w tym samym formacie na OP
Kris Boyd

6

Metoda document.getElementsByName zwraca tablicę elementów. Na przykład powinieneś najpierw wybrać.

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

4
To nie jest tablica, to NodeList :-)
Florian Margaine

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.