JavaScript lấy phần tử theo tên


127

Hãy xem xét chức năng này:

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

  alert (acc);
}

Và phần HTML này:

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

Hộp cảnh báo đang hiển thị, nhưng nó hiển thị "không xác định".


Nếu bạn có thể thay đổi hoàn toàn, tôi khuyên bạn nên thêm "id" trường vào hai trường đầu vào của mình và sử dụng document.getElementById, trả về chính xác một giá trị.
Odi

4
vẫn tốt hơn: var inputs = document.getElementsByTagName('input') , trả về một nút bấm, từ đó bạn có thể trích xuất cả hai phần tử như vậy: var pass = input.item ('pass'). Chỉ là một mẹo, điều này có thể tăng tốc mọi thứ nếu bạn đang xử lý một DOM lớn, vì getElementByIdsẽ tìm kiếm toàn bộ cây mỗi lần, trong khi đó một người gật đầu sẽ không, vì vậy nó nhanh hơn ...
Elias Van Ootegem

Mã nhỏ dễ thương thực sự XD
Guillermo Gutiérrez

Câu trả lời:


246

Lý do bạn thấy lỗi đó là vì document.getElementsByNametrả về một NodeListphần tử. Và một NodeListtrong những yếu tố không có .valuetài sản.

Sử dụng cái này thay thế:

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

30

Lưu ý số nhiều trong phương pháp này:

document.getElementsByName()

Điều đó trả về một mảng các phần tử, vì vậy hãy sử dụng [0] để có lần xuất hiện đầu tiên, ví dụ:

document.getElementsByName()[0]

8
Đây không phải là một mảng, đó là một NodeList :-)
Florian Margaine

1
@FlorianMargaine - Trên thực tế, đó là HTMLCollection ;)
j08691

1
@ j08691 nope :) nhưng nó có thể dễ dàng bị nhầm lẫn: p
Florian Margaine

Định nghĩa của một mảng là gì và nó khác nhau như thế nào? Một NodeList chỉ là một đối tượng bao quanh một mảng HTMLElements với một vài phương thức tiện lợi. Dù sao, để đặt nó trong các điều khoản của giáo dân cho OP, tôi đã nói một mảng.
Ozzy

1
Một mảng có nhiều phương thức hơn NodeList. Một NodeList mất một số phương pháp / tài sản từ các mảng như lengthbất động sản, nhưng nó cũng thiếu rất nhiều các phương pháp, chẳng hạn như map, forEachvv Trong đó giải thích tại sao chúng ta cần phải sử dụng: Array.prototype.forEach.call( NodeList, fn ).
Florian Margaine

11

Bạn muốn điều này:

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

    alert (acc);
}

Cảm ơn bạn đã sử dụng ví dụ của OP trong câu trả lời của bạn.
Kris Boyd

@KrisBoyd, sự khác biệt là tôi nhận được phần tử đầu tiên từ mảng được trả về getElementsByName. Có lẽ tôi nên nói rõ hơn - cứ thoải mái chỉnh sửa nếu bạn thích.
Elliot Boneville

Tôi đã cho bạn một bổ sung :) không có câu trả lời cao hơn nào có cùng định dạng tại OP
Kris Boyd

6

Phương thức document.getElementsByName trả về một mảng các phần tử. Bạn nên chọn đầu tiên, ví dụ.

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

4
Đây không phải là một mảng, đó là một NodeList :-)
Florian Margaine

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.