Yanıtlar:
JQuery 1.8 ve üstü için kullanabilirsiniz .addBack(). Bir seçici alır, böylece sonucu filtrelemenize gerek kalmaz:
object.find('selector').addBack('selector')
JQuery 1.8'den önce .andSelf(), daha sonra filtreleme gerektiren (artık kullanımdan kaldırıldı ve kaldırıldı) takılı kaldınız:
object.find('selector').andSelf().filter('selector')
'selector'iki kez belirtme ihtiyacı , kapsüllemeyi ekstra arzu edilir kılar. YMMV
'selector'iki kez belirtmek zorunda değilsin (@ronen tarafından belirtildiği gibi), sadece kullanamaz mısın object.parent().find('selector')??? - bunu sizin için yapan bir kitaplık fikrini sevdiğim söyleniyor.
object.parent().find('selector'), kardeşlerini objectve onların torunlarını içerir.
Bunu doğrudan yapamazsınız, aklıma en yakın olan kullanmak .andSelf()ve aramaktır .filter(), şöyle:
$(selector).find(oSelector).andSelf().filter(oSelector)
//or...
$(selector).find('*').andSelf().filter(oSelector);
Maalesef .andSelf()kullanışlı olacak bir seçici almıyor.
closest(..)geçerli DOM öğesini içerir ve ağacın yukarısını içerir, oysa find(..)vb. Gibi ağaçtan aşağı geçiş yöntemleri mevcut öğeyle eşleşmez. Sanki jQuery ekibi, tam bir dikey arama için her iki işlem birlikte kullanıldığında, bunları bilerek çakışma olmadan uyguluyor.
Tanımlamak
$.fn.findSelf = function(selector) {
var result = this.find(selector);
this.each(function() {
if ($(this).is(selector)) {
result.add($(this));
}
});
return result;
};
sonra kullan
$.findSelf(selector);
onun yerine
$find(selector);
Ne yazık ki jQuery'nin bu yerleşik özelliği yok. Yıllarca süren geliştirme için gerçekten garip. AJAX işleyicilerim, .find () işlevinin nasıl çalıştığı nedeniyle bazı üst öğelere uygulanmadı.
filter()burada kullanılır, bu daha mantıklıdır.
$('selector').find('otherSelector').add($('selector').filter('otherSelector'))
$('selector')Hızlandırmak için bir değişkende saklayabilirsiniz . Çok ihtiyacınız varsa bunun için özel bir işlev bile yazabilirsiniz:
$.fn.andFind = function(expr) {
return this.find(expr).add(this.filter(expr));
};
$('selector').andFind('otherSelector')
$('selector').find('otherSelector').add($('otherSelector')), şu anda sahip olduğunuz şeye eşdeğerdir .andSelf(). Son olarak, .andFind()ifadeye göre filtreleme yapmaz, yapmanız gerekir .add($(this).filter(expr)):)
$('selector')Bir jQuery nesnesi elde etmenin başka bir yöntemiyle değiştirilip değiştirilmemesi gerçekten önemli değil (eğer bir seçici ile başlamayarak kastettiğin buysa), add()her şeyi olabildiğince $()halledebilir.
$('selector')olabilir $('selector').children('filter').closest('.class').last()... bir zincirde olabilir ve eklediğiniz nesnenin ne olduğu hakkında hiçbir fikriniz yok, bu nedenle genel çözüm önceki nesneyi filtrenin yaptığı gibi almalıdır :)
thiseklentinin çağrıldığı jQuery nesnesidir. Bir çağrı zincirinin sonucu da olabilir.
Kabul edilen cevap çok verimsizdir ve zaten eşleşen öğeler kümesini filtreler.
//find descendants that match the selector
var $selection = $context.find(selector);
//filter the parent/context based on the selector and add it
$selection = $selection.add($context.filter(selector);
Zincirlemenin düzgün çalışmasını istiyorsanız aşağıdaki parçacığı kullanın.
$.fn.findBack = function(expr) {
var r = this.find(expr);
if (this.is(expr)) r = r.add(this);
return this.pushStack(r);
};
End işlevi çağrıldıktan sonra #foo öğesini döndürür.
$('#foo')
.findBack('.red')
.css('color', 'red')
.end()
.removeAttr('id');
Fazladan eklenti tanımlamadan, buna bağlı kalırsınız.
$('#foo')
.find('.red')
.addBack('.red')
.css('color', 'red')
.end()
.end()
.removeAttr('id');
thisbirden fazla öğe this.is()varsa, bunlardan sadece biri eşleşirse zaten tatmin olur.
Mevcut veya içindeki bir öğe olmak üzere tam olarak bir öğe arıyorsanız , şunları kullanabilirsiniz:
result = elem.is(selector) ? elem : elem.find(selector);
Birden fazla öğe arıyorsanız, şunları kullanabilirsiniz:
result = elem.filter(selector).add(elem.find(selector));
andSelf/ Kullanımı andBackoldukça nadirdir, neden olduğundan emin değilim. Belki de bazılarının benden önce bahsettiği performans sorunları yüzünden.
( Tgr'nin o ikinci çözümü zaten verdiğini şimdi fark ettim )
Bunun eski bir soru olduğunu biliyorum ama daha doğru bir yol var. Sıra önemliyse, örneğin bir seçici ile eşleştiriyorsanız , mevcut öğe kümesini gerçekten içeriyormuş :firstgibi tam olarak aynı sonucu döndürecek küçük bir işlev yazdım find():
$.fn.findAll = function(selector) {
var $result = $();
for(var i = 0; i < this.length; i++) {
$result = $result.add(this.eq(i).filter(selector));
$result = $result.add(this.eq(i).find(selector));
}
return $result.filter(selector);
};
Hiçbir şekilde verimli olmayacak, ancak doğru düzeni sağlamak için bulduğum en iyisi bu.
Mevcut düğümlere kesinlikle bakıyorsanız, yapmanız gereken sadece
$(html).filter('selector')
Kendini tekrar etmeyen bir çözüm bulmaya çalışıyordum (yani aynı seçiciye iki kez girmiyorum).
Ve bu küçük jQuery uzantısı bunu yapıyor:
jQuery.fn.findWithSelf = function(...args) {
return this.pushStack(this.find(...args).add(this.filter(...args)));
};
find()(Yalnızca torunları) filter()(yalnızca mevcut küme) ile birleştirir ve her ikisinin de yediği argümanları destekler. pushStack()Sağlar .end()beklendiği gibi çalışmaya.
Bunun gibi kullanın:
$(element).findWithSelf('.target')
İşte doğru (ama üzücü) gerçek:
$(selector).parent().find(oSelector).filter($(selector).find('*'))
$(selector)her durumda setten çıkarılır.