JavaScript รับองค์ประกอบตามชื่อ


127

พิจารณาฟังก์ชันนี้:

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

  alert (acc);
}

และส่วน 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>

กล่องการแจ้งเตือนกำลังแสดง แต่จะแสดง "ไม่ได้กำหนด"


หากคุณสามารถเปลี่ยนแปลงได้ทั้งหมดฉันขอแนะนำให้เพิ่มฟิลด์ "id" ลงในช่องอินพุตสองช่องของคุณและใช้document.getElementByIdซึ่งจะส่งกลับค่าเดียว
Odi

4
ยังดีกว่า: var inputs = document.getElementsByTagName('input')ส่งคืน nodelist ซึ่งคุณสามารถแยกองค์ประกอบทั้งสองได้ดังนี้: var pass = inputs.item ('pass') เพียงแค่เคล็ดลับนี้สามารถเร่งความเร็วได้หากคุณกำลังจัดการกับ DOM ขนาดใหญ่เช่นเดียวกับการgetElementByIdค้นหาต้นไม้ทั้งหมดในแต่ละครั้งในขณะที่ผู้สร้างแบบจำลองจะไม่ทำดังนั้นจึงเร็วกว่า ...
Elias Van Ootegem

โค้ดน้อยน่ารักแน่นอน XD
Guillermo Gutiérrez

คำตอบ:


246

สาเหตุที่คุณเห็นข้อผิดพลาดนั้นเป็นเพราะdocument.getElementsByNameส่งคืนNodeListองค์ประกอบ และNodeListองค์ประกอบหนึ่งไม่มี.valueคุณสมบัติ

ใช้สิ่งนี้แทน:

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

30

สังเกตพหูพจน์ในวิธีนี้:

document.getElementsByName()

ที่ส่งคืนอาร์เรย์ขององค์ประกอบดังนั้นให้ใช้ [0] เพื่อรับการเกิดครั้งแรกเช่น

document.getElementsByName()[0]

8
ไม่ใช่อาร์เรย์ แต่เป็น NodeList :-)
Florian Margaine

1
@FlorianMargaine - จริงๆแล้วมันเป็นHTMLCollection ;)
j08691

1
@ j08691 ไม่ :) แต่มันอาจจะสับสนได้ง่ายๆ: p
Florian Margaine

คำจำกัดความของอาร์เรย์คืออะไรและแตกต่างกันอย่างไร? NodeList เป็นเพียงออบเจ็กต์ที่พันรอบอาร์เรย์ของ HTMLElements ด้วยวิธีอำนวยความสะดวก อย่างไรก็ตามเพื่อให้อยู่ในเงื่อนไขของคนธรรมดาสำหรับ OP ฉันพูดอาร์เรย์
Ozzy

1
อาร์เรย์มีเมธอดมากกว่า NodeList NodeList ใช้เวลาบางส่วนวิธีการ / คุณสมบัติจากอาร์เรย์เช่นlengthทรัพย์สิน แต่ก็ยังขาดหายไปเป็นจำนวนมากของวิธีการเช่นmap, forEachฯลฯ Array.prototype.forEach.call( NodeList, fn )ซึ่งอธิบายได้ว่าทำไมเราต้องใช้งาน:
Florian Margaine

11

คุณต้องการสิ่งนี้:

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

    alert (acc);
}

ขอบคุณที่ใช้ตัวอย่างของ OP ในคำตอบของคุณ
Kris Boyd

@KrisBoyd getElementsByNameความแตกต่างคือการที่ฉันได้รับองค์ประกอบแรกจากแถวที่ส่งกลับโดย บางทีฉันควรจะทำให้ชัดเจนกว่านี้ - อย่าลังเลที่จะแก้ไขถ้าคุณต้องการ
Elliot Bonneville

ฉันให้คำตอบแก่คุณ :) ไม่มีคำตอบใดที่สูงกว่าในรูปแบบเดียวกันที่ OP
Kris Boyd

6

เมธอด document.getElementsByName ส่งคืนอาร์เรย์ขององค์ประกอบ คุณควรเลือกก่อนเช่น

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

4
ไม่ใช่อาร์เรย์ แต่เป็น NodeList :-)
Florian Margaine

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.