Saat ini saya sedang mencoba menulis JavaScript untuk mendapatkan atribut dari kelas yang telah diklik. Saya tahu bahwa untuk melakukan ini dengan cara yang benar, saya harus menggunakan pendengar acara. Kode saya adalah sebagai berikut:
var classname = document.getElementsByClassName("classname");
var myFunction = function() {
var attribute = this.getAttribute("data-myattribute");
alert(attribute);
};
classname.addEventListener('click', myFunction(), false);
Saya mengharapkan untuk mendapatkan kotak peringatan setiap kali saya mengklik salah satu kelas untuk memberi tahu saya atributnya tetapi sayangnya ini tidak berhasil. Apakah ada yang bisa membantu?
( Catatan - Saya dapat dengan mudah melakukan ini, jQuery
tetapi saya TIDAK ingin menggunakannya )
javascript
dom-events
30secondstosam
sumber
sumber
Jawaban:
Ini seharusnya bekerja.
getElementsByClassName
mengembalikanarrayObjek miriparray(lihat edit) dari elemen yang cocok dengan kriteria.jQuery melakukan bagian perulangan untuk Anda, yang perlu Anda lakukan dalam JavaScript biasa.
Jika Anda memiliki dukungan ES6, Anda dapat mengganti baris terakhir dengan:
Catatan: Browser yang lebih lama (seperti IE6, IE7, IE8) tidak mendukung
getElementsByClassName
sehingga mereka kembaliundefined
.EDIT: Koreksi
getElementsByClassName
tidak mengembalikan array, tetapi HTMLCollection di sebagian besar, atau NodeList di beberapa browser ( Mozilla ref ). Kedua jenis ini adalah Array-Like, (artinya mereka memiliki properti panjang dan objek dapat diakses melalui indeks mereka), tetapi tidak sepenuhnya merupakan Array atau diwarisi dari Array. (artinya metode lain yang dapat dilakukan pada Array tidak dapat dilakukan pada jenis ini)Terima kasih kepada pengguna @ Nemo untuk menunjukkan ini dan membuat saya menggali untuk memahami sepenuhnya.
sumber
document.getElementsByClassName
sebenarnya selalu mengembalikan array, bahkan jika hanya satu elemen yang cocok dengan kriteriaArray.from()
memiliki parameter kedua yang merupakan fungsi peta sehingga hal di atas (dengan asumsi dukungan es6) dapat ditulisArray.from(classname, c => c.addEventListener('click', myFunction));
.* Ini diedit untuk memungkinkan anak-anak dari kelas target untuk memicu acara. Lihat bagian bawah jawaban untuk detailnya. *
Jawaban alternatif untuk menambahkan pendengar acara ke kelas di mana item sering ditambahkan dan dihapus. Ini terinspirasi oleh jQuery's
on
fungsi mana Anda bisa memberikan pemilih untuk elemen anak yang didengarkan acara tersebut.Biola: https://jsfiddle.net/u6oje7af/94/
Ini akan mendengarkan klik pada anak-anak
base
elemen dan jika target klik memiliki orangtua yang cocok dengan pemilih, acara kelas akan ditangani. Anda dapat menambah dan menghapus elemen sesuka Anda tanpa harus menambahkan lebih banyak pendengar klik ke masing-masing elemen. Ini akan menangkap mereka semua bahkan untuk elemen yang ditambahkan setelah pendengar ini ditambahkan, sama seperti fungsi jQuery (yang saya bayangkan agak mirip di bawah tenda).Ini tergantung pada acara yang disebarkan, jadi jika Anda
stopPropagation
berada di acara di tempat lain, ini mungkin tidak berfungsi. Juga,closest
fungsi ini memiliki beberapa masalah kompatibilitas dengan IE rupanya (apa yang tidak?).Ini dapat dibuat menjadi fungsi jika Anda perlu melakukan jenis tindakan mendengarkan berulang kali, seperti
=========================================
Edit: Posting ini awalnya menggunakan
matches
fungsi untuk Elemen DOM pada target acara, tetapi ini membatasi target acara hanya untuk kelas langsung. Ini telah diperbarui untuk menggunakanclosest
fungsi sebagai gantinya, memungkinkan untuk acara pada anak-anak dari kelas yang diinginkan untuk memicu acara juga.matches
Kode asli dapat ditemukan di biola asli: https://jsfiddle.net/u6oje7af/23/sumber
Anda dapat menggunakan kode di bawah ini:
sumber
evt.target.classList.contains('databox')
Dengan JavaScript modern dapat dilakukan seperti ini:
event.target
untuk mengambil lebih banyak informasi untuk elemen tertentusumber