Saya memiliki tata letak ini yang dibuat secara dinamis:
for (let i = 1; i < 10; i++) {
document.querySelector('.card-body').innerHTML += `<div class="row" id="img_div">
<div class="col-12 col-sm-12 col-md-2 text-center">
<img src="http://placehold.it/120x80" alt="prewiew" width="120" height="80">
</div>
<div id="text_div" class="col-12 text-sm-center col-sm-12 text-md-left col-md-6">
<h4 class="name"><a href="#" id="title` + i + `">Name</a></h4>
<h4>
<small>state</small>
</h4>
<h4>
<small>city</small>
</h4>
<h4>
<small>zip</small>
</h4>
</div>
<div class="col-12 col-sm-12 text-sm-center col-md-4 text-md-right row">
</div>
</div>
`
document.getElementById("title" + i).addEventListener('click', function() {
console.log(i)
});
}
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<div class="card-body">
<!-- person -->
</div>
Dan saya ingin mendapatkan acara klik pada masing h4 class="name"
- masing dan menunjukkan log dengan nomor yang i
terkait.
Namun, console.log
hanya menunjukkan yang i
terkait terakhir ( i=9
dalam hal ini), dan tidak berfungsi dengan i
angka lainnya . Mengapa ini terjadi? Apa yang harus saya lakukan?
javascript
html
innerhtml
Luiz Adorno
sumber
sumber
for
loop Anda memanggil metode untuk menerapkan peristiwa ke elemen-elemen itu, tapi saya tidak tahu. akan jsFiddle untuk menguji..card-body
dan periksa apakah elemen (target
) adalah jangkar dengan dan ID yang dimulai dengantitle
.innerHTML += ...
membunuh pendengar acara yang ditetapkan sebelumnya, bukan penutupan. Gunakandocument.createElement
sebagai gantinya. Lihat utas iniJawaban:
innerHTML
redraws html penuh, sebagai akibatnya semua acara yang terlampir sebelumnya hilang. MenggunakaninsertAdjacentHTML()
sumber
insertAdjacentHTML
- Setiap hari schoolday, sangat bagus.document.getElementById
segera digunakan setelah menambahkan HTML. Jika Anda menambahkan ratusan elemen, ini banyak pekerjaan traverse.name
dan menyesuaikan acara hanya kelas sambil melewati elemen (atau mungkin hanya membaca dari acara itu sendiri) lebih efisien?document.createElement
dapat digunakan, saya pikir itu umumnya pendekatan dasar terbaik. Peningkatan lain yang mungkin untuk posting ini adalah menggunakan dua loop: satu untuk membangun semua HTML, lalu yang lain untuk mengambil semua elemen menggunakan kelas dalam satudocument.querySelectorAll
panggilan dan menambahkan pendengar acara.Menggunakan
+=
padainnerHTML
pendengar acara Rusak pada unsur-unsur di dalam HTML. Cara yang benar untuk melakukan ini adalah menggunakandocument.createElement
. Berikut ini contoh minimal yang lengkap:Tentu saja,
document.getElementById
tidak perlu di sini karena kita baru saja membuat objek di blok loop. Ini menghemat jalan-jalan pohon yang berpotensi mahal.Jika Anda memiliki potongan acak HTML yang dirubah seperti dalam contoh Anda, Anda dapat menggunakan
createElement("div")
, mengatur satuinnerHTML
kali ke chunk dan menambahkan pendengar sesuai kebutuhan. Kemudian tambahkan divs sebagai anak-anak elemen wadah Anda.sumber
<div>
, laludiv.innerHTML += yourHugeChunkOfHTML
. Jadi tidak ada alasan ini tidak bisa digunakan untuk kasus penggunaan apa pun.