Dalam kode contoh berikut, saya melampirkan onclick
event handler ke span yang berisi teks "foo". Penangan adalah fungsi anonim yang memunculkan filealert()
.
Namun, jika saya menetapkan ke node induk innerHTML
, inionclick
penanganan peristiwa akan dihancurkan - mengklik "foo" gagal memunculkan kotak peringatan.
Apakah ini bisa diperbaiki?
<html>
<head>
<script type="text/javascript">
function start () {
myspan = document.getElementById("myspan");
myspan.onclick = function() { alert ("hi"); };
mydiv = document.getElementById("mydiv");
mydiv.innerHTML += "bar";
}
</script>
</head>
<body onload="start()">
<div id="mydiv" style="border: solid red 2px">
<span id="myspan">foo</span>
</div>
</body>
</html>
Jawaban:
Sayangnya, penugasan
innerHTML
menyebabkan kehancuran semua elemen turunan, meskipun Anda mencoba menambahkan. Jika Anda ingin mempertahankan node turunan (dan penangan kejadiannya), Anda harus menggunakan fungsi DOM :Edit: solusi Bob, dari komentar. Posting jawaban Anda, Bob! Dapatkan pujian untuk itu. :-)
sumber
Menggunakan
.insertAdjacentHTML()
mempertahankan event listener, dan didukung oleh semua browser utama . Ini adalah pengganti satu baris sederhana untuk.innerHTML
.The
'beforeend'
menspesifikasikan argumen di mana dalam elemen untuk memasukkan konten HTML. Pilihan yang'beforebegin'
,'afterbegin'
,'beforeend'
, dan'afterend'
. Lokasi yang sesuai adalah:sumber
Sekarang, tahun 2012, dan jQuery telah menambahkan dan menambahkan fungsi yang melakukan hal ini dengan tepat, menambahkan konten tanpa memengaruhi konten saat ini. Sangat berguna.
sumber
.insertAdjacentHTML
telah ada sejak IE4Sebagai bantuan kecil (tetapi terkait), jika Anda menggunakan pustaka javascript seperti jquery (v1.3) untuk melakukan manipulasi dom Anda, Anda dapat menggunakan acara langsung di mana Anda menyiapkan penangan seperti:
dan itu akan diterapkan ke selektor itu setiap saat selama segala jenis manipulasi jquery. Untuk acara langsung lihat: docs.jquery.com/events/live untuk manipulasi jquery lihat: docs.jquery.com/manipulation
sumber
Saya membuat markup saya untuk disisipkan sebagai string karena lebih sedikit kode dan lebih mudah dibaca daripada bekerja dengan barang-barang dom mewah.
Kemudian saya membuatnya menjadi innerHTML dari elemen sementara supaya saya bisa mengambil satu-satunya anak dari elemen itu dan menempelkannya ke tubuh.
sumber
something.innerHTML + = 'tambahkan apapun yang Anda inginkan';
itu berhasil untuk saya. Saya menambahkan tombol ke teks input menggunakan solusi ini
sumber
Ada alternatif lain: menggunakan
setAttribute
daripada menambahkan pendengar acara. Seperti ini:sumber
Ya, itu mungkin jika Anda mengikat peristiwa menggunakan atribut tag
onclick="sayHi()"
secara langsung di template yang mirip dengan Anda<body onload="start()">
- pendekatan ini mirip dengan frameworks angular / vue / react / etc. Anda juga dapat menggunakan<template>
untuk mengoperasikan html 'dinamis' seperti di sini . Ini bukan js yang tidak mengganggu namun dapat diterima untuk proyek kecilsumber
Kehilangan penangan peristiwa, IMO, adalah bug dalam cara Javascript menangani DOM. Untuk menghindari perilaku ini, Anda dapat menambahkan yang berikut ini:
sumber
mydiv.onclick
. Hanya klik rentang dalam yang diganti olehinnerHTML +=
.Anda bisa melakukannya seperti ini:
sumber
Cara termudah adalah dengan menggunakan array dan mendorong elemen ke dalamnya dan kemudian memasukkan nilai-nilai berikutnya ke dalam array secara dinamis. Ini kode saya:
sumber
Untuk semua larik objek dengan header dan data.
jsfiddle
https://jsfiddle.net/AmrendraKumar/9ac75Lg0/2/
sumber
Saya seorang programmer yang malas. Saya tidak menggunakan DOM karena sepertinya pengetikan tambahan. Bagi saya, semakin sedikit kode semakin baik. Berikut cara saya menambahkan "bar" tanpa mengganti "foo":
sumber