สั้นและง่าย:เนื่องจากองค์ประกอบที่คุณต้องการไม่มีอยู่ในเอกสาร (ยัง)
สำหรับส่วนที่เหลือของคำตอบนี้ผมจะใช้getElementById
เป็นตัวอย่าง แต่เช่นเดียวกับgetElementsByTagName
, querySelector
และวิธีการ DOM อื่น ๆ ที่เลือกองค์ประกอบ
เหตุผลที่เป็นไปได้
มีสองเหตุผลที่องค์ประกอบอาจไม่มีอยู่:
องค์ประกอบที่มีรหัสผ่านไม่ได้มีอยู่จริงในเอกสาร คุณควรตรวจสอบอีกครั้งว่า ID ที่คุณส่งไปgetElementById
ตรงกับ ID ขององค์ประกอบที่มีอยู่ใน HTML (สร้าง) แล้วและคุณไม่ได้สะกด ID (ID เป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ )!
อนึ่งในเบราว์เซอร์ร่วมสมัยส่วนใหญ่ที่ใช้งานquerySelector()
และquerySelectorAll()
วิธีการสัญกรณ์สไตล์ CSS จะใช้ในการดึงองค์ประกอบโดยid
ตัวอย่างเช่นdocument.querySelector('#elementID')
เมื่อเทียบกับวิธีการที่องค์ประกอบถูกดึงโดยid
ภายใต้document.getElementById('elementID')
; ในตอนแรก#
ตัวละครมีความสำคัญในครั้งที่สองมันจะนำไปสู่องค์ประกอบที่ไม่ถูกดึงออกมา
องค์ประกอบที่ไม่ได้อยู่ในขณะที่getElementById
คุณเรียก
กรณีหลังค่อนข้างทั่วไป เบราว์เซอร์แยกวิเคราะห์และประมวลผล HTML จากบนลงล่าง ซึ่งหมายความว่าการเรียกองค์ประกอบ DOM ที่เกิดขึ้นก่อนองค์ประกอบ DOM นั้นจะปรากฏใน HTML จะล้มเหลว
ลองพิจารณาตัวอย่างต่อไปนี้:
<script>
var element = document.getElementById('my_element');
</script>
<div id="my_element"></div>
div
ปรากฏหลังจาก script
ในขณะที่สคริปต์ที่จะดำเนินการองค์ประกอบไม่ได้อยู่เลยและจะกลับมาgetElementById
null
jQuery
เช่นเดียวกับตัวเลือกทั้งหมดที่มี jQuery jQuery จะไม่พบองค์ประกอบถ้าคุณสะกดผิดตัวเลือกของคุณหรือคุณกำลังพยายามที่จะเลือกพวกเขาก่อนที่พวกเขามีอยู่จริง
การบิดเพิ่มคือเมื่อไม่พบ jQuery เนื่องจากคุณโหลดสคริปต์โดยไม่มีโปรโตคอลและทำงานจากระบบไฟล์:
<script src="//somecdn.somewhere.com/jquery.min.js"></script>
ไวยากรณ์นี้ใช้เพื่อให้สคริปต์โหลดผ่าน HTTPS บนหน้าเว็บที่มีโปรโตคอล https: // และโหลดรุ่น HTTP บนหน้าเว็บที่มีโปรโตคอล http: //
มันมีผลข้างเคียงที่โชคร้ายของการพยายามและล้มเหลวในการโหลด file://somecdn.somewhere.com...
โซลูชั่น
ก่อนที่คุณจะโทรไปที่getElementById
(หรือวิธีการ DOM สำหรับเรื่องนั้น) ตรวจสอบให้แน่ใจว่าองค์ประกอบที่คุณต้องการเข้าถึงนั้นมีอยู่นั่นคือโหลด DOM แล้ว
นี้สามารถมั่นใจได้โดยเพียงแค่ใส่ JavaScript ของคุณหลังจากองค์ประกอบ DOM ที่สอดคล้องกัน
<div id="my_element"></div>
<script>
var element = document.getElementById('my_element');
</script>
ในกรณีที่คุณสามารถใส่รหัสก่อนแท็กปิดร่างกาย ( </body>
) (องค์ประกอบ DOM ทั้งหมดจะสามารถใช้ได้ในเวลาที่สคริปต์ถูกดำเนินการ)
การแก้ปัญหาอื่น ๆ ได้แก่ การฟังไปload
[MDN]หรือDOMContentLoaded
[MDN]เหตุการณ์ ในกรณีเหล่านี้ไม่สำคัญว่าในเอกสารที่คุณวางรหัส JavaScript คุณต้องจำไว้ว่าให้ใส่รหัสการประมวลผล DOM ทั้งหมดลงในตัวจัดการเหตุการณ์
ตัวอย่าง:
window.onload = function() {
// process DOM elements here
};
// or
// does not work IE 8 and below
document.addEventListener('DOMContentLoaded', function() {
// process DOM elements here
});
โปรดดูบทความที่ quirksmode.orgสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการจัดการเหตุการณ์และความแตกต่างของเบราว์เซอร์
jQuery
ก่อนอื่นตรวจสอบให้แน่ใจว่าโหลด jQuery อย่างถูกต้อง ใช้เครื่องมือสำหรับนักพัฒนาของเบราว์เซอร์เพื่อค้นหาว่าพบไฟล์ jQuery และแก้ไข URL หากไม่ได้เป็นเช่นนั้น (เช่นเพิ่มhttp:
หรือhttps:
โครงร่างในตอนเริ่มต้นปรับเส้นทาง ฯลฯ )
ฟังload
/ DOMContentLoaded
เหตุการณ์ที่เกิดขึ้นเป็นสิ่งที่ jQuery จะทำกับ[เอกสาร].ready()
รหัส jQuery ทั้งหมดของคุณที่มีผลต่อองค์ประกอบ DOM ควรอยู่ในตัวจัดการเหตุการณ์นั้น
ในความเป็นจริงการสอน jQueryระบุอย่างชัดเจน:
เกือบทุกอย่างที่เราทำเมื่อใช้ jQuery อ่านหรือปรับเปลี่ยนโมเดลวัตถุเอกสาร (DOM) เราต้องตรวจสอบให้แน่ใจว่าเราเริ่มเพิ่มกิจกรรม ฯลฯ ทันทีที่ DOM พร้อม
ในการทำสิ่งนี้เราลงทะเบียนเหตุการณ์ที่พร้อมสำหรับเอกสาร
$(document).ready(function() {
// do stuff when DOM is ready
});
หรือคุณสามารถใช้ไวยากรณ์ชวเลขได้:
$(function() {
// do stuff when DOM is ready
});
ทั้งสองมีความเท่าเทียมกัน