Saya ingin menjalankan fungsi ketika pengguna mengedit konten div
dengan contenteditable
atribut. Apa yang setara dengan suatu onchange
acara?
Saya menggunakan jQuery sehingga solusi apa pun yang menggunakan jQuery lebih disukai. Terima kasih!
javascript
jquery
html
contenteditable
Jourkey
sumber
sumber
document.getElementById("editor").oninput = function() { ...}
.Jawaban:
Saya sarankan melampirkan pendengar ke acara utama yang dipecat oleh elemen yang dapat diedit, meskipun Anda harus menyadari itu
keydown
dankeypress
acara dipecat sebelum kontennya diubah. Ini tidak akan mencakup segala cara yang mungkin untuk mengubah konten: pengguna juga dapat menggunakan memotong, menyalin, dan menempel dari menu browser Edit atau konteks, sehingga Anda mungkin ingin menanganicut
copy
danpaste
acara juga. Selain itu, pengguna dapat menjatuhkan teks atau konten lain, sehingga ada lebih banyak acara di sana (mouseup
, misalnya). Anda mungkin ingin mensurvei konten elemen sebagai fallback.PEMBARUAN 29 Oktober 2014
The HTML5
input
acara adalah jawaban dalam jangka panjang. Pada saat penulisan, ini didukung untukcontenteditable
elemen dalam Mozilla saat ini (dari Firefox 14) dan browser WebKit / Blink, tetapi tidak untuk IE.Demo:
Demo: http://jsfiddle.net/ch6yn/2691/
sumber
cut
,copy
danpaste
acara di browser yang mendukungnya (IE 5+, Firefox 3.0+, Safari 3+, Chrome)input
acara HTML5 .Ini adalah versi yang lebih efisien yang digunakan
on
untuk semua konten yang dapat diedit. Ini didasarkan dari jawaban teratas di sini.Proyeknya ada di sini: https://github.com/balupton/html5edit
sumber
document.getElementById('editor_input').innerHTML = 'ssss'
. Kekurangannya adalah itu membutuhkanPertimbangkan menggunakan MutationObserver . Pengamat ini dirancang untuk bereaksi terhadap perubahan DOM, dan sebagai pengganti pemain untuk Acara Mutasi .
Pro:
Cons:
Belajarlah lagi:
sumber
input
acara HTML5 (yang didukung untukcontenteditable
semua browser WebKit dan Mozilla yang mendukung pengamat mutasi), karena mutasi DOM dapat terjadi melalui skrip serta input pengguna, tetapi ini merupakan solusi yang layak untuk browser tersebut. Saya membayangkan itu bisa merusak kinerja lebih dariinput
peristiwa itu juga, tetapi saya tidak punya bukti kuat untuk ini.input
acara HTML5 menyala di setiap situasi ini (khusus seret & jatuhkan, miringkan, salin / potong / tempel melalui menu konteks). Saya juga menguji huruf tebal w / cmd / ctrl + b dan mendapatkan hasil yang diharapkan. Saya juga memeriksa dan dapat memverifikasi bahwainput
acara tersebut tidak memicu perubahan terprogram (yang tampak jelas, tetapi bisa dibilang bertentangan dengan beberapa bahasa membingungkan pada halaman MDN yang relevan; lihat bagian bawah halaman di sini untuk melihat apa yang saya maksud: pengembang .mozilla.org / en-US / docs / Web / Acara / input )Saya telah mengubah jawaban lawwantsin seperti itu dan ini bekerja untuk saya. Saya menggunakan acara keyup bukan penekanan tombol yang berfungsi dengan baik.
sumber
non jQuery jawaban cepat dan kotor :
sumber
Dua pilihan:
1) Untuk browser modern (evergreen): Acara "input" akan bertindak sebagai acara "perubahan" alternatif.
https://developer.mozilla.org/en-US/docs/Web/Events/input
atau
atau (dengan jQuery)
2) Untuk menjelaskan browser IE11 dan modern (evergreen): Ini mengawasi perubahan elemen dan isinya di dalam div.
https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
sumber
sumber
Inilah yang bekerja untuk saya:
sumber
Utas ini sangat membantu saat saya menyelidiki masalah ini.
Saya telah memodifikasi beberapa kode yang tersedia di sini menjadi plugin jQuery sehingga itu dalam bentuk yang dapat digunakan kembali, terutama untuk memenuhi kebutuhan saya tetapi yang lain mungkin menghargai antarmuka yang lebih sederhana untuk memulai dengan menggunakan tag yang dapat diedit.
https://gist.github.com/3410122
Memperbarui:
Karena popularitasnya yang semakin meningkat, plugin ini telah diadopsi oleh Makesites.org
Pengembangan akan berlanjut dari sini:
https://github.com/makesites/jquery-contenteditable
sumber
Inilah solusi yang akhirnya saya gunakan dan bekerja dengan luar biasa. Saya menggunakan $ (this) .text () sebagai gantinya karena saya hanya menggunakan satu baris div yang dapat diedit konten. Tetapi Anda juga dapat menggunakan .html () dengan cara ini Anda tidak perlu khawatir tentang ruang lingkup variabel global / non-global dan sebelumnya benar-benar dilampirkan ke editor editor.
sumber
Untuk menghindari penghitung waktu dan tombol "simpan", Anda dapat menggunakan acara blur yang menyala ketika elemen kehilangan fokus. tetapi untuk memastikan bahwa elemen tersebut benar-benar diubah (tidak hanya fokus dan tidak fokus), isinya harus dibandingkan dengan versi terakhirnya. atau gunakan acara keydown untuk mengatur beberapa bendera "kotor" pada elemen ini.
sumber
Sebuah jawaban sederhana di JQuery, saya baru saja membuat kode ini dan berpikir itu akan bermanfaat bagi orang lain juga
sumber
$("div [contenteditable=true]")
akan memilih semua anak dari div, secara langsung atau tidak langsung, yang dapat diedit.Bukan jawaban JQuery ...
Untuk menggunakannya, panggil (katakanlah) elemen tajuk dengan id = "myHeader"
Elemen itu sekarang akan dapat diedit oleh pengguna sampai kehilangan fokus.
sumber
Acara onchange tidak menyala ketika elemen dengan atribut contentEditable diubah, pendekatan yang disarankan bisa dengan menambahkan tombol, untuk "menyimpan" edisi.
Periksa plugin ini yang menangani masalah dengan cara itu:
sumber
Menggunakan DOMCharacterDataModified di bawah MutationEvents akan mengarah ke hal yang sama. Batas waktu disetel untuk mencegah pengiriman nilai yang salah (mis. Di Chrome saya mengalami beberapa masalah dengan tombol spasi)
Contoh JSFIDDLE
sumber
DOMCharacterDataModified
tidak akan diaktifkan ketika pengguna memodifikasi teks yang ada, misalnya menerapkan cetak tebal atau miring.DOMSubtreeModified
lebih tepat dalam hal ini. Selain itu, orang harus ingat bahwa browser lama tidak mendukung acara ini.Saya membangun plugin jQuery untuk melakukan ini.
Anda cukup menelepon
$('.wysiwyg').wysiwygEvt();
Anda juga dapat menghapus / menambah acara jika diinginkan
sumber
innerHTML
mahal). Saya akan merekomendasikan menggunakaninput
acara di mana itu ada dan jatuh kembali ke sesuatu seperti ini tetapi dengan semacam debouncing.Dalam Angular 2+
sumber
Silakan ikuti solusi sederhana berikut ini
Dalam .ts:
dalam .html:
sumber
Lihat ide ini. http://pastie.org/1096892
Saya pikir sudah dekat. HTML 5 benar-benar perlu menambahkan acara perubahan ke spec. Satu-satunya masalah adalah bahwa fungsi callback mengevaluasi if (before == $ (this) .html ()) sebelum konten benar-benar diperbarui dalam $ (this) .html (). setTimeout tidak berfungsi, dan itu menyedihkan. Biarkan aku tahu apa yang Anda pikirkan.
sumber
Berdasarkan jawaban @ balupton:
sumber