Saya harus menggunakan vanilla JavaScript untuk sebuah proyek. Saya punya beberapa fungsi, salah satunya adalah tombol yang membuka menu. Ini berfungsi pada halaman di mana id target ada, tetapi menyebabkan kesalahan pada halaman di mana id tidak ada. Pada halaman di mana fungsi tidak dapat menemukan id, saya menerima kesalahan "Tidak dapat membaca properti 'addEventListener' dari null" dan tidak ada fungsi saya yang lain yang berfungsi.
Di bawah ini adalah kode untuk tombol yang membuka menu.
function swapper() {
toggleClass(document.getElementById('overlay'), 'open');
}
var el = document.getElementById('overlayBtn');
el.addEventListener('click', swapper, false);
var text = document.getElementById('overlayBtn');
text.onclick = function(){
this.innerHTML = (this.innerHTML === "Menu") ? "Close" : "Menu";
return false;
};
Bagaimana saya menangani ini? Saya mungkin perlu membungkus semua kode ini di fungsi lain atau menggunakan pernyataan if / else sehingga hanya mencari id pada halaman tertentu, tetapi tidak yakin persis.
class
html Anda dan bukanid
dan Anda memanggilgetElementById
dalam skrip Anda.Jawaban:
Saya pikir pendekatan termudah adalah dengan hanya memeriksa bahwa
el
tidak null sebelum menambahkan pendengar acara:sumber
null
sebelum komponen react dipasang!Tampaknya itu
document.getElementById('overlayBtn');
kembalinull
karena dijalankan sebelum DOM dimuat sepenuhnya.Jika Anda meletakkan baris kode ini di bawah
maka itu akan berjalan tanpa masalah.
Contoh:
sumber
Saya menghadapi situasi serupa. Ini mungkin karena skrip dijalankan sebelum halaman dimuat. Dengan menempatkan skrip di bagian bawah halaman, saya menghindari masalah.
sumber
Saya mendapatkan kesalahan yang sama, tetapi melakukan pemeriksaan nol sepertinya tidak membantu.
Solusi yang saya temukan adalah membungkus fungsi saya di dalam event listener untuk seluruh dokumen untuk diperiksa ketika DOM selesai memuat.
Saya pikir ini karena saya menggunakan kerangka kerja (Angular) yang mengubah kelas HTML dan ID saya secara dinamis.
sumber
Ini hanya karena JS Anda dimuat sebelum bagian HTML dan karenanya tidak dapat menemukan elemen itu. Letakkan saja seluruh kode JS Anda di dalam fungsi yang akan dipanggil saat jendela dimuat.
Anda juga dapat meletakkan kode Javascript Anda di bawah html.
sumber
skrip dimuat sebelum tubuh, simpan skrip setelah konten
sumber
Letakkan skrip di akhir tag badan.
sumber
Terima kasih kepada @Rob M. atas bantuannya. Seperti inilah tampilan blok kode terakhir:
sumber
Saya hanya menambahkan 'async' ke tag skrip saya, yang tampaknya telah memperbaiki masalah tersebut. Saya tidak yakin mengapa, jika seseorang bisa menjelaskan, tetapi itu berhasil untuk saya. Dugaan saya adalah bahwa halaman tersebut tidak menunggu skrip dimuat, sehingga halaman dimuat pada waktu yang sama dengan JavaScript.
Async / Await memungkinkan kita untuk menulis kode asinkron secara sinkron. itu hanya gula sintaksis menggunakan generator dan pernyataan hasil untuk "jeda" eksekusi, memberi kita kemampuan untuk menetapkannya ke variabel!
Berikut link referensi- https://medium.com/siliconwat/how-javascript-async-await-works-3cab4b7d21da
sumber
Saya mengalami masalah yang sama dan memeriksa null tetapi tidak membantu. Karena skrip dimuat sebelum pemuatan halaman. Jadi hanya dengan menempatkan skrip sebelum tag badan akhir menyelesaikan masalah.
sumber
Seperti yang dikatakan orang lain, masalahnya adalah skrip dieksekusi sebelum halaman (dan khususnya elemen target) dimuat.
Tapi saya tidak suka solusi penataan ulang konten.
Solusi yang lebih disukai adalah meletakkan pengendali peristiwa di halaman saat memuat peristiwa dan menyetel Pemroses di sana. Itu akan memastikan halaman dan elemen target dimuat sebelum tugas dijalankan. misalnya
sumber
Saya memiliki kumpulan kutipan bersama dengan nama. Saya menggunakan tombol perbarui untuk memperbarui kutipan terakhir yang terkait dengan nama tertentu tetapi saat mengklik tombol perbarui itu tidak memperbarui. Saya menyertakan kode di bawah ini untuk file server.js dan file js eksternal (main.js).
main.js (js eksternal)
file server.js
sumber
Terima kasih dari semua, Muat Skrip di halaman tertentu yang Anda gunakan, bukan untuk semua halaman, terkadang menggunakan swiper.js atau pustaka lain dapat menyebabkan pesan kesalahan ini, satu-satunya cara untuk menyelesaikan masalah ini adalah memuat pustaka JS pada halaman tertentu ID tersebut ada dan mencegah pemuatan perpustakaan yang sama di semua halaman.
Semoga ini membantu Anda.
sumber
Saya memiliki masalah yang sama, tetapi ID saya ada. Jadi saya mencoba menambahkan "window.onload = init;" Lalu saya membungkus kode JS asli saya dengan fungsi init (sebut saja apa yang Anda inginkan). Ini berfungsi, jadi setidaknya dalam kasus saya, saya menambahkan pendengar acara sebelum dokumen saya dimuat. Ini bisa jadi apa yang Anda alami juga.
sumber
Ini karena elemen belum dimuat pada saat bundle js dijalankan.
Saya akan memindahkan
<script src="sample.js" type="text/javascript"></script>
ke bagian paling bawahindex.html
file. Dengan cara ini Anda dapat memastikan skrip dijalankan setelah semua elemen html telah diurai dan dirender.sumber
Tambahkan semua event listener saat jendela dimuat.Bekerja seperti pesona di mana pun Anda meletakkan tag skrip.
sumber
load
juga tidak digunakan lagi karena alasan yang sama. DOMContentLoaded adalah cara yang lebih disukai, karena ini hanya diaktifkan setelah DOM ditarik sepenuhnya.