Metode traversal jQuery find (..) tidak menyertakan simpul saat ini - dimulai dengan anak-anak dari simpul saat ini. Apa cara terbaik untuk memanggil operasi pencarian yang menyertakan simpul saat ini dalam algoritme yang cocok? Melihat melalui dokumen tidak ada yang langsung melompat ke arahku.
134
'selector'
dua kali membuat enkapsulasi lebih diinginkan. YMMV'selector'
dua kali, (seperti yang disebutkan oleh @ronen), tidak bisakah Anda menggunakan sajaobject.parent().find('selector')
??? - itu dikatakan saya suka ide lib yang melakukannya untuk Anda.object.parent().find('selector')
termasuk saudara kandungobject
dan keturunan mereka.Anda tidak dapat melakukan ini secara langsung, yang paling dekat yang dapat saya pikirkan adalah menggunakan
.andSelf()
dan menelepon.filter()
, seperti ini:Sayangnya
.andSelf()
tidak mengambil pemilih, yang akan berguna.sumber
closest(..)
termasuk elemen DOM saat ini dan naik pohon sedangkan semua metode traversal turun-pohon sepertifind(..)
dll tidak cocok dengan elemen saat ini. Seolah-olah tim jQuery sengaja mengimplementasikan ini tanpa tumpang tindih ketika kedua operasi digunakan bersama untuk pencarian vertikal penuh.Menetapkan
lalu gunakan
dari pada
Sayangnya jQuery tidak memiliki fitur bawaan ini. Sangat aneh selama bertahun-tahun pembangunan. Penangan AJAX saya tidak diterapkan ke beberapa elemen teratas karena cara kerja .find ().
sumber
filter()
sana, yang lebih masuk akal.Anda dapat menyimpan
$('selector')
dalam variabel untuk speedup. Anda bahkan dapat menulis fungsi khusus untuk ini jika Anda sangat membutuhkannya:sumber
$('selector').find('otherSelector').add($('otherSelector'))
, apa yang Anda miliki sekarang setara dengan.andSelf()
. Terakhir,.andFind()
filter tidak didasarkan pada ekspresi, Anda harus.add($(this).filter(expr))
:)$('selector')
diganti dengan metode lain untuk mendapatkan objek jQuery (jika itu yang Anda maksud dengan tidak memulai dengan pemilih),add()
bisa menangani apa saja seperti$()
bisa.$('selector')
mungkin$('selector').children('filter').closest('.class').last()
... mungkin dalam rantai dan Anda tidak tahu apa objek yang Anda tambahkan adalah, jadi solusi generik harus mengambil objek sebelumnya seperti yang dilakukan filter :)this
adalah objek jQuery apa pun yang dipanggil oleh plugin. Bisa juga hasil dari rantai panggilan.Jawaban yang diterima sangat tidak efisien dan memfilter sekumpulan elemen yang sudah cocok.
sumber
Jika Anda ingin rantai bekerja dengan benar, gunakan snippet di bawah ini.
Setelah panggilan fungsi akhir mengembalikan elemen #foo.
Tanpa mendefinisikan plugin tambahan, Anda akan terjebak dengan ini.
sumber
this
lebih dari satu elementhis.is()
sudah puas jika hanya satu yang cocok.Jika Anda mencari tepat satu elemen , baik elemen saat ini atau elemen di dalamnya, Anda dapat menggunakan:
Jika Anda mencari beberapa elemen yang dapat Anda gunakan:
Penggunaan
andSelf
/andBack
sangat jarang, tidak yakin mengapa. Mungkin karena masalah kinerja beberapa orang yang disebutkan sebelum saya.(Sekarang saya perhatikan bahwa Tgr sudah memberikan solusi kedua)
sumber
Saya tahu ini adalah pertanyaan lama, tetapi ada cara yang lebih benar. Jika pesanan itu penting, misalnya ketika Anda mencocokkan pemilih seperti
:first
, saya menulis sedikit fungsi yang akan mengembalikan hasil yang sama persis seolah-olahfind()
termasuk set elemen saat ini:Itu tidak akan efisien dengan cara apa pun, tapi itu yang terbaik yang saya buat untuk menjaga ketertiban.
sumber
Saya pikir
andSelf
adalah apa yang Anda inginkan:Perhatikan bahwa ini akan selalu menambah kembali simpul saat ini, apakah cocok dengan pemilih.
sumber
Jika Anda benar-benar mencari di simpul saat ini, Anda cukup melakukannya
sumber
Saya mencoba menemukan solusi yang tidak terulang kembali (yaitu tidak memasukkan pemilih yang sama dua kali).
Dan ekstensi jQuery kecil ini melakukannya:
Ini menggabungkan
find()
(hanya keturunan) denganfilter()
(hanya set saat ini) dan mendukung argumen apa pun yang dimakan. ThepushStack()
memungkinkan untuk.end()
bekerja seperti yang diharapkan.Gunakan seperti ini:
sumber
Inilah kebenaran yang benar (tapi menyedihkan):
http://jsfiddle.net/SergeJcqmn/MeQb8/2/
sumber
$(selector)
dirinya sendiri dari set di semua kasus.