Saya mencoba mencari cara untuk mengeksekusi beberapa kode js ketika sebuah elemen dihapus dari halaman:
jQuery('#some-element').remove(); // remove some element from the page
/* need to figure out how to independently detect the above happened */
apakah ada acara yang dirancang khusus untuk itu, seperti:
jQuery('#some-element').onremoval( function() {
// do post-mortem stuff here
});
Terima kasih.
Jawaban:
Baru diperiksa, ini sudah ada di dalam versi JQuery saat ini:
jQuery - v1.9.1
jQuery UI - v1.10.2
Penting : Ini adalah fungsionalitas skrip Jquery UI (bukan JQuery), jadi Anda harus memuat kedua skrip (jquery dan jquery-ui) untuk membuatnya berfungsi. Berikut ini contohnya: http://jsfiddle.net/72RTz/
sumber
remove
pada elemen itu api, tetapi jika elemen dihancurkan dengan cara lain, dengan ditimpa katakan, itu tidak berhasil.Anda dapat menggunakan acara khusus jQuery untuk ini.
Dalam semua kesederhanaan,
Mempersiapkan:
Pemakaian:
Tambahan untuk menjawab komentar Pierre dan DesignerGuy:
Agar panggilan balik tidak menyala saat memanggil
$('.thing').off('destroyed')
, ubah kondisi if ke:if (o.handler && o.type !== 'destroyed') { ... }
sumber
o.handler()
keo.handler.apply(this,arguments)
sebaliknya acara dan objek data tidak bisa melewati pendengar acara.$('.thing').unbind('destroyed')
yang benar-benar dapat mengganggu (karena tidak mengikat berarti kita tidak ingin pawang dipanggil ...)Anda dapat mengikat ke acara DOMNodeRemoved (bagian dari spesifikasi DOM Level 3 WC3).
Bekerja di IE9, rilis terbaru Firefox dan Chrome.
Contoh:
Anda juga bisa mendapatkan notifikasi ketika elemen memasukkan dengan mengikat
DOMNodeInserted
sumber
e.target.className
atauif ($(e.target).hasClass('my-class')) { ...
.Tidak ada acara bawaan untuk menghapus elemen, tetapi Anda dapat membuatnya dengan metode penghapusan default jQuery yang memperluas palsu. Perhatikan bahwa callback harus dipanggil sebelum benar-benar menghapusnya untuk menyimpan referensi.
Catatan: beberapa masalah dengan jawaban ini telah diuraikan oleh poster lain.
html()
replace()
atau metode jQuery lainnyaSolusi paling elegan untuk masalah ini adalah: https://stackoverflow.com/a/10172676/216941
sumber
$('#some-element').bind('remove', function(ev) { if (ev.target === this) { console.log('removed!'); } });
Hooking
.remove()
bukan cara terbaik untuk menangani ini karena ada banyak cara untuk menghapus elemen dari halaman (misalnya dengan menggunakan.html()
,.replace()
, dll).Untuk mencegah berbagai bahaya kebocoran memori, secara internal jQuery akan mencoba memanggil fungsi
jQuery.cleanData()
untuk setiap elemen yang dihapus terlepas dari metode yang digunakan untuk menghapusnya.Lihat jawaban ini untuk lebih jelasnya: kebocoran memori javascript
Jadi, untuk hasil terbaik, Anda harus mengaitkan
cleanData
fungsinya, yang persis seperti yang dilakukan plugin jquery.event.destroyed :http://v3.javascriptmvc.com/jquery/dist/jquery.event.destroyed.js
sumber
cleanData
ini sangat membantu saya! Terima kasih banyak, Joe :)Bagi mereka yang menggunakan jQuery UI:
jQuery UI telah diganti beberapa metode jQuery untuk melaksanakan
remove
acara yang akan ditangani tidak hanya ketika Anda secara eksplisit menghapus elemen yang diberikan, tetapi juga jika elemen akan dihapus dari DOM oleh membersihkan diri metode jQuery (misalnyareplace
,html
, dll) . Ini pada dasarnya memungkinkan Anda untuk memasang kail ke acara yang sama yang dipecat ketika jQuery "membersihkan" acara dan data yang terkait dengan elemen DOM.John Resig telah mengindikasikan bahwa dia terbuka untuk ide mengimplementasikan acara ini di versi inti jQuery di masa depan, tapi saya tidak yakin di mana tempatnya saat ini.
sumber
Hanya jQuery yang diperlukan (Tidak diperlukan UI jQuery)
( Saya telah mengekstrak ekstensi ini dari kerangka UI jQuery )
Bekerja dengan:
empty()
danhtml()
danremove()
Dengan solusi ini Anda juga dapat melepas ikatan handler acara.
Cobalah! - Contoh
Demo Tambahan - jsBin
sumber
Saya tidak bisa mendapatkan jawaban ini untuk bekerja dengan tidak mengikat (meskipun ada pembaruan lihat di sini ), tetapi saya bisa mencari jalan keluar. Jawabannya adalah untuk membuat acara khusus 'destroy_proxy' yang memicu acara 'hancur'. Anda menempatkan pendengar acara di 'hancur_proxy' dan 'dihancurkan', maka ketika Anda ingin melepaskan ikatan, Anda hanya membatalkan ikatan acara 'dihancurkan':
Ini biola
sumber
Saya suka jawaban mtkopone menggunakan acara khusus jQuery, tetapi perhatikan bahwa itu tidak berfungsi a) ketika elemen dilepaskan alih-alih dihapus atau b) ketika beberapa perpustakaan non-jquery lama menggunakan innerHTML untuk menghancurkan elemen Anda
sumber
detach
digunakan terutama untuk tidak memicu pembersihan karena elemen tersebut mungkin direncanakan untuk dipasang kembali nanti. b) masih benar dan belum ada penanganan yang dapat diandalkan, setidaknya sejak peristiwa mutasi DOM diimplementasikan secara luas.Saya tidak yakin ada pegangan acara untuk ini, jadi Anda harus menyimpan salinan DOM dan membandingkannya dengan DOM yang ada di semacam jajak pendapat - yang bisa sangat tidak menyenangkan. Firebug melakukan ini - jika Anda memeriksa HTML dan menjalankan beberapa perubahan DOM, Firebug menyoroti perubahan dalam warna kuning di konsol Firebug untuk waktu yang singkat.
Atau, Anda dapat membuat fungsi hapus ...
sumber
Ini adalah cara membuat pendengar hapus jQuery langsung :
Atau:
sumber
Acara "hapus" dari jQuery berfungsi dengan baik, tanpa penambahan. Mungkin lebih dapat diandalkan pada waktunya untuk menggunakan trik sederhana, daripada menambal jQuery.
Cukup modifikasi atau tambahkan atribut di elemen yang akan Anda hapus dari DOM. Dengan demikian, Anda dapat memicu fungsi pembaruan apa pun, yang hanya akan mengabaikan elemen yang akan dihancurkan, dengan atribut "do_not_count_it".
Misalkan kita memiliki tabel dengan sel yang sesuai dengan harga, dan Anda hanya perlu menunjukkan harga terakhir: Ini adalah pemilih untuk memicu ketika sel harga dihapus (kami memiliki tombol di setiap baris tabel yang melakukan itu, tidak ditampilkan sini)
Dan di sini adalah fungsi yang menemukan harga terakhir dalam tabel, tidak memperhitungkan yang terakhir, jika itu yang dihapus. Memang, ketika acara "hapus" dipicu, dan ketika fungsi ini dipanggil, elemen tersebut belum dihapus.
Pada akhirnya, fungsi update_prices () berfungsi dengan baik, dan setelah itu, elemen DOM dihapus.
sumber
referensi ke jawaban @vid:
Ketika Anda ingin melakukannya dengan fungsi lain, mis. html () seperti dalam kasus saya, jangan lupa tambahkan kembali dalam fungsi baru:
sumber
Ini.
sumber
ekstensi untuk jawaban Adam jika Anda perlu mencegah default, berikut ini adalah pekerjaannya:
sumber
Kami juga dapat menggunakan DOMNodeRemoved:
sumber