Saya sedang mengerjakan Ekstensi di Chrome, dan saya bertanya-tanya: apa cara terbaik untuk mengetahui kapan suatu elemen muncul? Menggunakan javascript biasa, dengan interval yang memeriksa hingga elemen ada, atau apakah jQuery punya cara mudah untuk melakukan ini?
237
MutationObserver
>DOM Mutation Events
>setTimeout
.setTimeout
kompatibel, mudah diimplementasikan, mudah dirawat, dan memiliki overhead yang dapat diabaikan.setTimeout
+jQuery
kurang dari ideal menurut saya karena dua alasan: 1.) jQuery mengasapi 2.) Anda tidak perlu secara manual menanyakan DOM untuk elemen, peristiwa mengalahkan kecepatan itu dengan mudah, 3.) itu akan selalu lebih lambat daripada yang asli penerapan. Jika Anda perlu melakukan apa pun berdasarkan kehadiran elemen yang cukup cepat, terutama jika pengalaman pengguna yang mulus adalah tujuan Anda, itu lebih rendah.Jawaban:
DOMNodeInserted
sedang tidak digunakan lagi, bersama dengan peristiwa mutasi DOM lainnya, karena masalah kinerja - pendekatan yang disarankan adalah menggunakan MutationObserver untuk menonton DOM. Ini hanya didukung di browser yang lebih baru, jadi Anda harus kembaliDOMNodeInserted
ketikaMutationObserver
tidak tersedia.sumber
if (mutation.addedNodes.length)
karenaif (mutation.addedNodes)
masih akan mengembalikan true walaupun array kosong. (2) Anda tidak dapat melakukanmutation.addedNodes.forEach()
karena ditambahkanNodes adalah nodeList dan Anda tidak dapat mengulangi melalui nodeList dengan forEach. Untuk solusi untuk ini, lihat toddmotto.com/ditch-the-array-foreach-call-nodelist-hackSaya mengalami masalah yang sama, jadi saya melanjutkan dan menulis sebuah plugin untuk itu.
$(selector).waitUntilExists(function);
Kode:
sumber
window.setInterval
). Saya tidak tahu apakahMutationObserver
jawabannya bekerja dengan pemungutan suara juga ...;
di awal fungsi (;(function ($, window) {
)?Berikut adalah fungsi inti JavaScript untuk menunggu tampilan elemen.
Parameter:
selector
: Fungsi ini mencari elemen $ {selector}time
: Fungsi ini memeriksa apakah elemen ini ada setiap $ {waktu} milidetik.Sebagai contoh, pengaturan
selector="#div1"
dantime=5000
akan mencari tag HTML yangid="div1"
setiap 5.000 milidetik.sumber
querySelector
? developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAnda dapat mendengarkan
DOMNodeInserted
atauDOMSubtreeModified
acara yang memanas kapan saja elemen baru ditambahkan ke DOM.Ada juga plugin LiveQuery jQuery yang akan mendeteksi ketika elemen baru dibuat:
sumber
Saya menggunakan pendekatan ini untuk menunggu elemen muncul sehingga saya dapat menjalankan fungsi lain setelah itu.
Katakanlah
doTheRestOfTheStuff(parameters)
fungsi hanya dipanggil setelah elemen dengan IDthe_Element_ID
muncul atau selesai memuat, kita dapat menggunakan,sumber
Anda dapat melakukan
Harap dicatat bahwa ini hanya akan berfungsi jika elemen ada di DOM ketika diminta dari server. Jika elemen ditambahkan secara dinamis melalui JavaScript, elemen itu tidak akan berfungsi dan Anda mungkin perlu melihat jawaban lainnya.
sumber
.ready()
karya fungsi untuk sebagian apa-apa (jika tidak apa-apa), tidak hanyadocument
. Itu tidak akan bekerja dengan elemen yang dibuat secara dinamis, bahkan pada.live()
.$(document).ready()
elemen biasa , bukan elemen yang Anda pikir akan berlaku juga. Begitulah cara pendengar khusus ini bekerja. ContohSaya pikir masih belum ada jawaban di sini dengan contoh kerja yang mudah dan mudah dibaca. Gunakan MutationObserver
interface
untuk mendeteksi perubahan DOM, seperti ini:sumber
Cukup tambahkan pemilih yang Anda inginkan. Setelah elemen ditemukan, Anda dapat memiliki akses ke dalam fungsi panggilan balik.
sumber
Untuk pendekatan sederhana menggunakan jQuery, saya menemukan ini berfungsi dengan baik:
Di sini kita cukup memeriksa setiap 500ms untuk melihat apakah elemen tersebut dimuat, ketika itu, kita dapat menggunakannya.
Ini sangat berguna untuk menambahkan penangan klik ke elemen yang telah ditambahkan secara dinamis ke dokumen.
sumber
Bagaimana dengan pustaka insertionQuery ?
insertionQuery menggunakan callback Animasi CSS yang dilampirkan pada pemilih yang ditentukan untuk menjalankan callback ketika sebuah elemen dibuat. Metode ini memungkinkan panggilan balik dijalankan setiap kali elemen dibuat, bukan hanya pertama kali.
Dari github:
sumber
Inilah fungsi yang bertindak sebagai pembungkus tipis di sekitar MutationObserver. Satu-satunya persyaratan adalah bahwa browser mendukung MutationObserver; tidak ada ketergantungan pada JQuery. Jalankan cuplikan di bawah untuk melihat contoh yang berfungsi.
sumber
Inilah solusi Pengembalian Janji dalam vanila Javascript (tidak ada panggilan balik yang berantakan). Secara default ia memeriksa setiap 200 ms.
sumber
Inilah fungsi Javascript murni yang memungkinkan Anda menunggu apa pun. Atur interval lebih lama untuk mengurangi sumber daya CPU.
Untuk memanggil ini, misalnya di jQuery, gunakan sesuatu seperti:
sumber
Solusi yang mengembalikan
Promise
dan memungkinkan untuk menggunakan batas waktu (IE 11+ yang kompatibel).Untuk satu elemen (tipe Elemen):
Untuk beberapa elemen (ketik NodeList):
Contoh:
Berfungsi untuk daftar elemen dan elemen tunggal.
sumber
element instanceof HTMLElement
? Bisakah itu menjadi sesuatu selainnull
atauHTMLElement
?Element
sebagai gantinya (diperbaiki). Saya hanya melakukan pemeriksaan karena saya ingin memastikan variabel tersebutelement
memiliki propertiinnerHTML
seperti yang dinyatakan oleh dokumentasi Elemen MDN . Jangan ragu untuk menghapusnya jika Anda tidak peduli!Contoh yang lebih bersih menggunakan MutationObserver:
sumber
Ini adalah solusi sederhana bagi mereka yang terbiasa dengan janji dan tidak ingin menggunakan lib atau timer pihak ketiga.
Saya telah menggunakannya dalam proyek saya untuk sementara waktu
Untuk menggunakannya:
atau dengan async / menunggu
sumber
async
/await
juga. Anda juga dapat memeras kinerja lebih banyak dengan melakukanmutations.addedNodes.find(node => node.matchesSelector("..."))
Jika Anda ingin berhenti mencari setelah beberapa saat (batas waktu) maka jQuery berikut ini akan berfungsi. Ini akan habis setelah 10 detik. Saya perlu menggunakan kode ini daripada JS murni karena saya perlu memilih input melalui nama dan mengalami kesulitan menerapkan beberapa solusi lain.
sumber
Saya biasanya menggunakan potongan ini untuk Pengelola Tag:
sumber
jika Anda memiliki perubahan dom async, fungsi ini memeriksa (dengan batas waktu dalam detik) untuk elemen DOM, itu tidak akan berat untuk DOM dan berdasarkan janjinya :)
sumber