JQuery'de bir öğenin n. Düzey üst öğesini nasıl edinebilirim?


151

Örneğin almak istediğim öğenin 3. seviye üst öğesini almak istediğimde Bunun için $('#element').parent().parent().parent()daha uygun bir yöntem var mı?


2
Benim eleman herhangi calss kimliği veya adı olmayabilir çünkü, sadece numarası (Level) vermek ve eleman almak istiyorum
Artur Keyan

1
Bu işlevi yeniden kullanmayı planlıyorsanız, en uygun çözüm bir jQuery eklentisi oluşturmaktır.
zzzzBov

3
Bazı performans karşılaştırmaları için jsperf.com/jquery-get-3rd-level-parent adresine bakın
a'r

1
Başka bir iyi araç da ".closest ()" fonksiyonudur. $ ('li.item'). en yakın ('div') size li.item'in en yakın atası olan DIV'yi verecektir. Öğenin kaç seviye yukarı olduğunu bilmediğinizde iyi, ancak tagname / class / başka bir şey biliyorsunuz.
Graham

Yanıtlar:


267

Yana veliler () dış olanlardan en yakın sipariş atası elemanlarını döndürür sen içine zincir olabilir ) (eq :

$('#element').parents().eq(0);  // "Father".
$('#element').parents().eq(2);  // "Great-grandfather".

$ ('# element'). ebeveynleri () [2] kullanabilir miyim? ya da eq (2) ile yapmalı
Artur Keyan

1
Bu, birden fazla öğe seçimi için işe yaramaz, daha güvenli bir yol olacaktır:$('.element').first().parents().eq(num);
zzzzBov

6
@Arthur, kullanarak [2]temel DOM öğesini eq(2)döndürür , kullanarak bir jQuery nesnesi döndürür.
Frédéric Hamidi

1
@zzzzBov, çok doğru, ancak sorucının durumunda yalnızca bir öğe seçilecek (çünkü bir kimlikle eşleştiğinden).
Frédéric Hamidi

"#Element" kimliğine bakarsanız, ID aramaları bu şekilde çalıştığı için yalnızca tek bir öğe döndürür, dom'daki bu kimliğe sahip ilk öğeyi döndürür. Öte yandan "div # element" ya da bir sınıf seçici yapmış olsaydınız haklı olursunuz.
Henry

29

İhtiyaçlarınıza bağlı olarak, hangi üst öğeyi aradığınızı biliyorsanız .parents () seçiciyi kullanabilirsiniz.

EG: http://jsfiddle.net/HenryGarle/Kyp5g/2/

<div id="One">
    <div id="Two">
        <div id="Three">
            <div id="Four">

            </div>
        </div>
    </div>
</div>


var top = $("#Four").parents("#One");

alert($(top).html());

Dizin kullanan örnek:

//First parent - 2 levels up from #Four
// I.e Selects div#One
var topTwo = $("#Four").parents().eq(2);

alert($(topTwo ).html());

Şimdi bu şekilde, ama seviye vermek istiyorum
Artur Keyan

3
Cevabı aşağıda okuyun ve her şey ortaya çıkacaktır! (Sana seviye örnekleri verdim)
Henry

Bu, diğer tüm seçiciler için iyi çalışır. Örneğin, belirli bir sınıfa sahip tüm ebeveynlerin ve ebeveynlerin listesini istiyorsanız, bu onları döndürür.
darksky

8

Hedef üst öğeye bir kimlik veya sınıf (ör. MyParent) verebilirsiniz ve başvuru $('#element').parents(".myParent")


Ben sadece sayı vermek ve eleman almak istiyorum, çünkü elemanım herhangi bir calss kimliği veya adı olmayabilir
Artur Keyan

6

Daha hızlı bir yol, javascript'i doğrudan kullanmaktır, örn.

var parent = $(innerdiv.get(0).parentNode.parentNode.parentNode);

Bu, tarayıcımda jQuery .parent()çağrılarını zincirlemekten çok daha hızlı çalışır .

Bkz. Http://jsperf.com/jquery-get-3rd-level-parent


"Önemli ölçüde daha hızlı" olarak, hız farkı açısından yaklaşık bir büyüklük sırasına bakıyoruz (Chrome 51'de jQuery 1.10.1 çalışıyor). Hız için ayar yapıyorsanız kesinlikle uygulamaya değer.
Iain Fraser

5

Kullanarak herhangi bir cevap bulamadım closest() ve gerekli öğenin kaç seviye olduğunu bilmediğinizde en basit cevap olduğunu düşünüyorum, bu yüzden bir cevap gönderme: Eşleşen ilk öğeyi almak için seçicilerle birlikte işlevi
kullanabilirsiniz closest()elemandan yukarı doğru hareket ederken:

('#element').closest('div')    // returns the innermost 'div' in its parents
('#element').closest('.container')    // returns innermost element with 'container' class among parents
('#element').closest('#foo')    // returns the closest parent with id 'foo'

3

Basit. Sadece kullan

$(selector).parents().eq(0); 

burada 0 üst düzeydir (0 üst öğedir, 1 üst öğenin üst öğesidir vb.)



3

Bu işlevi yeniden kullanmayı planlıyorsanız, en uygun çözüm bir jQuery eklentisi yapmaktır:

(function($){
$.fn.nthParent = function(n){
  var $p = $(this);
  while ( n-- >= 0 )
  {
    $p = $p.parent();
  }
  return $p;
};
}(jQuery));

Tabii ki, isteğe bağlı bir seçiciye ve diğer şeylere izin vermek için genişletmek isteyebilirsiniz.

Bir not: bu, 0ebeveynler için temel bir dizin kullanır , bu nedenle nthParent(0)arama ile aynıdır parent(). 1Temel dizin oluşturmayı tercih ediyorsanız ,n-- > 0


Ben bu kısmı daha hızlı bulacaksınız: var p = 1 + n; while (p--) { $p = $p.parent(); }ve 1 tabanlı değiştirmek istiyorsanız, Javascript kullanabilirsiniz "falsey" kullanabilirsiniz: while (n--) { $p = $p.parent();} bir koşullu kontrol kaydetme
Mark Schultheiss

@ Mark Schultheiss, Sadece hız değil, güvenilirlikle de ilgili. Birisi cahilce ararsa işlevinize ne olur nthParent(-2)? Örneğiniz kırıldı.
zzzzBov

VEYA sadece geri dön(function($) { $.fn.nthParent = function(n) { return $(this).parents().eq(n); }; }(jQuery));
Mark Schultheiss

@ Mark Schultheiss, yine güvenilirlik. Benim işlevi için nthParent döndüren her , seçimdeki eleman sizin fonksiyon döner listesinde inci elemanını parentsbirden fazla eleman ile seçimleri için yanlış olacak.
43

-2 ile ilgili olarak doğrudur ve var p = n >? (1 + n):1; bunun yerine örneğinizde olduğu gibi, bu durumda "hiçbir şey" yerine ilk ebeveyni döndürür - veya örneğimdeki döngüyü kırar. Yani, muhtemelen şöyle olmalıdır: (function($) { $.fn.nthParent = function(n) { var $p = $(this); if (!(n > -0)) { return $() }; var p = 1 + n; while (p--) { $p = $p.parent(); } return $p; }; }(jQuery)); eğer bir şey geri dönmek istemiyorsanız.
Mark Schultheiss

3

Ortak bir ana div'iniz varsa parentUntil () bağlantısını kullanabilirsiniz

Örneğin: $('#element').parentsUntil('.commonClass')

Avantajı, bu öğe ile ortak ebeveyn (ortak sınıf tarafından tanımlanır) arasında kaç nesil olduğunu hatırlamanıza gerek olmamasıdır.


1

Ayrıca kullanabilirsiniz :

$(this).ancestors().eq(n) 

örnek: $(this).ancestors().eq(2)-> öğesinin üst öğesinin üst öğesi this.


0

Bunun gibi bir şey kullanabilirsiniz:

(function($) {
    $.fn.parentNth = function(n) {
        var el = $(this);
        for(var i = 0; i < n; i++)
            el = el.parent();

        return el;
    };
})(jQuery);

alert($("#foo").parentNth(2).attr("id"));

http://jsfiddle.net/Xeon06/AsNUu/


1
Downvoter değil, ama bu muhtemelen en kötü çözüm (yani verimsiz).
zatatatata

0

eq kullanmak dinamik DOM'u yakalarken, .parent (). parent () kullanmak başlangıçta yüklenmiş olan DOM'u (hatta mümkünse) kapmak gibi görünür.

Her ikisini de sınıfları büyük ölçüde uygulayan bir öğede kullanıyorum. eq sınıfları .parent (). parent () göstermezken gösterir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.