jQueryで要素のn番目のレベルの親を取得するにはどうすればよいですか?


151

たとえば、作成する必要がある要素の3番目のレベルの親を取得したい場合$('#element').parent().parent().parent()、これに最適な方法はありますか?


2
数値(レベル)のみを取得して要素を取得したいのですが、私の要素にはcalss IDまたは名前が含まれていない可能性があります
Artur Keyan

1
この機能の再利用を計画している場合、最適なソリューションはjQueryプラグインを作成することです。
zzzzBov 2011

3
いくつかのパフォーマンスの比較については、jsperf.com / jquery
get

1
もう1つの優れたツールは、「。closest()」関数です。$( 'li.item')。closest( 'div')は、li.itemの最も近い祖先であるDIVを提供します。要素のレベルがいくつあるかはわからないが、タグ名/クラス/その他がわかっている場合に適しています。
グラハム

回答:


267

以来両親は()外のものに近いから注文祖先要素を返し、あなたはにそれをチェーンすることができます)(EQ

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

この$( '#element')。parents()[2]を使用できますか?または、eq(2)を使用する必要があります
Artur Keyan 2011

1
これは、複数の要素の選択のための作業を、より安全な方法は次のようになりません。$('.element').first().parents().eq(num);
zzzzBov

6
@ Arthur、using [2]は基になるDOM要素eq(2)を返し、using はjQueryオブジェクトを返します。
フレデリックハミディ2011

1
@zzzzBov、非常に真実ですが、質問者のケースでは1つの要素のみが選択されます(彼がIDに一致するため)。
フレデリックハミディ

ID "#element"でルックアップを行うと、IDルックアップが機能する方法である単一のエレメントのみが返され、DOM内のそのIDを持つ最初のエレメントが返されます。一方、「div#element」またはクラスセレクターを使用した場合は、正しいでしょう。
ヘンリー

29

探している親がわかっている場合は、ニーズに応じて.parents()セレクターを使用できます。

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());

インデックスを使用した例:

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

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

私は今、このようにしていますが、レベルを上げたいと思います
Artur Keyan

3
答えをさらに読み進めれば、すべてが明らかになるでしょう!(レベルの例を挙げました)
ヘンリー

これは、他のすべての種類のセレクターでうまく機能します。たとえば、特定のクラスを持つすべての親と親の親のリストが必要な場合、これはそれらを返します。
darksky 2017

8

ターゲットの親にIDまたはクラス(例:myParent)を与えることができ、参照は $('#element').parents(".myParent")


私の要素にはcalss IDまたは名前がない可能性があるため、数値のみを取得して要素を取得したいと思います
Artur Keyan

6

より速い方法は、javascriptを直接使用することです。

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

これは、jQuery .parent()呼び出しをチェーンするよりも私のブラウザーで非常に速く実行されます。

参照:http : //jsperf.com/jquery-get-3rd-level-parent


「大幅に高速化」することで、速度の違い(Chrome 51でjQuery 1.10.1を実行)の観点から約1桁を見ています。速度を調整する場合は、実装する価値があります。
Iain Fraser

5

を使用closest() して回答が見つかりませんでした。必要な要素のレベルがいくつあるかわからない場合は、最も簡単な回答だと思います。回答を投稿します。セレクタと組み合わせ
closest()関数を使用して、一致する最初の要素を取得できます要素から上方にトラバースする場合:

('#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

それは簡単です。使うだけ

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

ここで、0は親レベルです(0は親、1は親の親など)


3

次の:eq()ようにセレクタを追加するだけです:

$("#element").parents(":eq(2)")

親を指定するインデックスを指定するだけです:0は直接の親、1は祖父母、...


この方法は、仕事を完了するための最速の方法です。これを証明するためのベンチマークは次のとおり
java-man-script

3

この機能の再利用を計画している場合、最適なソリューションはjQueryプラグインを作成することです。

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

もちろん、オプションのセレクターなどを許可するように拡張することもできます。

注:これは、0親のベースインデックスを使用するためnthParent(0)、を呼び出すのと同じparent()です。1ベースのインデックスを作成したい場合は、n-- > 0


私はあなたがこの部分をより速く見つけると思います:var p = 1 + n; while (p--) { $p = $p.parent(); }1ベースに変更したい場合は、JavaScriptを「偽」にして使用できます:while (n--) { $p = $p.parent();} 条件付きチェックの保存
Mark Schultheiss

@Mark Schultheiss、それはスピードだけではなく、信頼性についてもです。誰かが無意識に呼び出した場合、関数はどうなりますnthParent(-2)か?あなたの例は壊れています。
zzzzBov 2011

または単に戻る(function($) { $.fn.nthParent = function(n) { return $(this).parents().eq(n); }; }(jQuery));
Mark Schultheiss

@Mark Schultheiss、ここでも信頼性。私の関数は、選択内のすべての要素のnthParentを返します。関数は、リスト内のn番目の要素を返します。その要素は、parents複数の要素を含む選択では正しくありません。
zzzzBov 2011

-2に関してtrueであり、例のようにvar p = n >? (1 + n):1; 代わりに使用すると、「何も」ではなく最初の親が返されます。つまり、私の例ではループが中断されます。SO、それはおそらく必要があります:(function($) { $.fn.nthParent = function(n) { var $p = $(this); if (!(n > -0)) { return $() }; var p = 1 + n; while (p--) { $p = $p.parent(); } return $p; }; }(jQuery)); 何も返さない場合。
Mark Schultheiss、2011

3

共通の親divがある場合は、parentsUntil()リンクを使用できます

例えば: $('#element').parentsUntil('.commonClass')

利点は、この要素と共通の親(commonclassで定義)の間に何世代あるかを覚えておく必要がないことです。



0

あなたはこのようなものを使うことができます:

(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
反対投票者ではありませんが、これはおそらくここで最悪の解決策(つまり、非効率的)です。
zatatatata

0

eqを使用すると動的DOMを取得するように見えますが、.parent()。parent()を使用すると最初にロードされたDOMを取得するように見えます(それが可能な場合でも)。

私はonmouseoverに適用されたクラスを持つ要素で両方を使用します。eqはクラスを表示しますが、.parent()。parent()は表示しません。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.