Singkat dan sederhana: Karena elemen yang Anda cari belum ada dalam dokumen (belum).
Untuk sisa jawaban ini saya akan menggunakan getElementById
sebagai contoh, tetapi hal yang sama berlaku untuk getElementsByTagName
, querySelector
dan metode DOM lainnya yang memilih elemen.
Kemungkinan Alasan
Ada dua alasan mengapa suatu elemen mungkin tidak ada:
Elemen dengan ID yang diteruskan benar-benar tidak ada dalam dokumen. Anda harus mengecek apakah ID yang Anda berikan getElementById
benar - benar cocok dengan ID dari elemen yang ada di HTML (yang dihasilkan) dan Anda belum salah mengeja ID (ID peka huruf besar kecil !).
Secara kebetulan, di sebagian besar browser kontemporer , yang menerapkan querySelector()
dan querySelectorAll()
metode, notasi gaya-CSS digunakan untuk mengambil elemen dengan id
, misalnya document.querySelector('#elementID')
:, sebagai lawan dari metode dimana elemen diambil oleh di id
bawahnya document.getElementById('elementID')
; pada karakter pertama #
sangat penting, pada karakter kedua akan menyebabkan elemen tidak diambil.
Elemen tidak ada pada saat Anda menelepon getElementById
.
Kasus terakhir cukup umum. Browser mem-parsing dan memproses HTML dari atas ke bawah. Itu berarti bahwa setiap panggilan ke elemen DOM yang terjadi sebelum elemen DOM muncul di HTML, akan gagal.
Perhatikan contoh berikut:
<script>
var element = document.getElementById('my_element');
</script>
<div id="my_element"></div>
The div
muncul setelah para script
. Pada saat script dijalankan, elemen tidak ada belum dan getElementById
akan kembali null
.
jQuery
Hal yang sama berlaku untuk semua penyeleksi dengan jQuery. jQuery tidak akan menemukan elemen jika Anda salah mengeja pemilih atau Anda mencoba memilihnya sebelum benar-benar ada .
Sentuhan tambahan adalah ketika jQuery tidak ditemukan karena Anda telah memuat skrip tanpa protokol dan berjalan dari sistem file:
<script src="//somecdn.somewhere.com/jquery.min.js"></script>
sintaks ini digunakan untuk memungkinkan skrip memuat melalui HTTPS pada halaman dengan protokol https: // dan untuk memuat versi HTTP pada halaman dengan protokol http: //
Ini memiliki efek samping yang disayangkan ketika mencoba dan gagal memuat file://somecdn.somewhere.com...
Solusi
Sebelum Anda melakukan panggilan ke getElementById
(atau metode DOM apa pun), pastikan elemen yang ingin Anda akses ada, yaitu DOM dimuat.
Ini dapat dipastikan dengan hanya menempatkan JavaScript Anda setelah elemen DOM yang sesuai
<div id="my_element"></div>
<script>
var element = document.getElementById('my_element');
</script>
dalam hal ini Anda juga dapat meletakkan kode tepat sebelum tag penutup tubuh ( </body>
) (semua elemen DOM akan tersedia pada saat skrip dijalankan).
Solusi lain termasuk mendengarkan acara load
[MDN] atau DOMContentLoaded
[MDN] . Dalam kasus ini, tidak masalah di mana dalam dokumen Anda menempatkan kode JavaScript, Anda hanya harus ingat untuk meletakkan semua kode pemrosesan DOM dalam event handler.
Contoh:
window.onload = function() {
// process DOM elements here
};
// or
// does not work IE 8 and below
document.addEventListener('DOMContentLoaded', function() {
// process DOM elements here
});
Silakan lihat artikel di quirksmode.org untuk informasi lebih lanjut mengenai penanganan acara dan perbedaan browser.
jQuery
Pertama, pastikan jQuery dimuat dengan benar. Gunakan alat pengembang browser untuk mencari tahu apakah file jQuery ditemukan dan perbaiki URL jika tidak (mis. Tambahkan skema http:
atau https:
di awal, sesuaikan jalur, dll.)
Mendengarkan load
/ DOMContentLoaded
events adalah persis apa yang dilakukan jQuery dengan .ready()
[docs] . Semua kode jQuery Anda yang memengaruhi elemen DOM harus ada di dalam pengendali event tersebut.
Bahkan, tutorial jQuery secara eksplisit menyatakan:
Karena hampir semua yang kita lakukan saat menggunakan jQuery membaca atau memanipulasi model objek dokumen (DOM), kita perlu memastikan bahwa kita mulai menambahkan peristiwa dll segera setelah DOM siap.
Untuk melakukan ini, kami mendaftarkan acara yang siap untuk dokumen.
$(document).ready(function() {
// do stuff when DOM is ready
});
Atau Anda juga dapat menggunakan sintaks steno:
$(function() {
// do stuff when DOM is ready
});
Keduanya setara.