jQuery에서 요소의 n 번째 수준 부모를 얻으려면 어떻게해야합니까?


151

예를 들어, 내가 작성해야하는 요소의 3 차 부모를 얻으려면 $('#element').parent().parent().parent()더 최적의 방법이 있습니까?


2
내 요소에 calss id 또는 이름이 없을 수 있기 때문에 숫자 (Level)
만주

1
이 기능을 재사용하려는 경우 최적의 솔루션은 jQuery 플러그인을 만드는 것입니다.
zzzzBov

3
성능 비교에 대해서는 jsperf.com/jquery-get-3rd-level-parent 를 참조하십시오
a'r

1
또 다른 좋은 도구는 ".closest ()"함수입니다. $ ( 'li.item'). closest ( 'div')는 li.item의 가장 가까운 조상 인 DIV를 제공합니다. 요소의 레벨이 몇 개인 지 모르지만 태그 이름 / 클래스 / 다른 것을 알고있는 경우에 좋습니다.
Graham

답변:


267

때문에 부모가 () 외부 사람에 가장 가까운에서 주문 조상 요소를 반환, 당신은에 그것을 체인 수 ) (EQ :

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

이 $ ( '# element'). parents () [2]를 사용할 수 있습니까? 또는 반드시 eq (2)를 사용해야합니다
Artur Keyan

1
여러 요소를 선택할 때는 작동하지 않습니다. 더 안전한 방법은 다음과 같습니다.$('.element').first().parents().eq(num);
zzzzBov

6
@Arthur를 사용 [2]하면 기본 DOM 요소 eq(2)가 반환되고 jQuery 객체가 반환됩니다.
프레데릭 하 미디

1
@zzzzBov는 매우 사실이지만 질문자의 경우 하나의 요소 만 선택됩니다 (ID와 일치하기 때문에).
프레데릭 하 미디

ID "#element"를 조회하면 ID 조회가 작동하는 방식이므로 단일 요소 만 반환하며, dom에서 해당 ID를 가진 첫 번째 요소를 반환합니다. 반면에 "div # element"또는 클래스 선택기를 사용했다면 적절할 것입니다.
Henry

29

찾고있는 부모를 아는 경우 필요에 따라 .parents () 선택기를 사용할 수 있습니다.

예 : 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
답을 자세히 읽으면 모든 것이 드러날 것입니다! (나는 당신에게 수준의 예
Henry

이것은 다른 모든 종류의 선택기에 잘 작동합니다. 예를 들어, 특정 클래스를 가진 모든 부모와 부모의 목록을 원하면 반환합니다.
darksky

8

대상 부모에게 ID 또는 클래스 (예 : myParent)를 줄 수 있으며 참조는 $('#element').parents(".myParent")


내 요소에 calss ID 나 이름이 없을 수 있기 때문에 숫자
만주

6

더 빠른 방법은 자바 스크립트를 직접 사용하는 것입니다.

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

jQuery .parent()호출을 연결하는 것보다 브라우저에서 훨씬 빠르게 실행됩니다 .

참조 : http://jsperf.com/jquery-get-3rd-level-parent


"상당히 더 빠르다"는 속도 차이 (Chrome 51에서 jQuery 1.10.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, ...


이 방법은 작업을 완료하는 가장 빠른 방법입니다. 이를 입증하는 벤치 마크는 다음과 같습니다. jsperf.com/jquery-get-element-s-nth-parent
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로 변경하고 싶다면, 자바 스크립트는 "falsey는"당신이 사용할 수있는 것 : while (n--) { $p = $p.parent();} 조건부 체크 절약
마크 Schultheiss

@ Mark Schultheiss, 속도뿐만 아니라 신뢰성도 중요합니다. 누군가 무지하게 전화하면 기능은 어떻게됩니까 nthParent(-2)? 귀하의 예가 깨졌습니다.
zzzzBov

또는 그냥 돌아 오십시오(function($) { $.fn.nthParent = function(n) { return $(this).parents().eq(n); }; }(jQuery));
Mark Schultheiss

@Mark Schultheiss, 다시 한 번 신뢰성. 기능의 nthParent를 반환 마다 , 선택의 요소 귀하의 함수가 반환 목록에서 n 번째 요소 parents두 개 이상의 요소와 선택에 대한 부정확 할 것이다있다.
zzzzBov

-2와 관련하여 true이며 var p = n >? (1 + n):1; 대신 예제를 사용하면 "아무것도"가 아니라 첫 번째 부모를 반환하거나 내 예제에서 루프를 끊는 위치를 반환합니다. (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

3

공통 상위 div가있는 경우 parentsUntil () 링크를 사용할 수 있습니다

예 : $('#element').parentsUntil('.commonClass')

장점은이 요소와 공통 상위 (commonclass에 의해 정의 됨) 사이에 몇 세대가 있는지 기억할 필요가 없다는 것입니다.


1

당신은 또한 사용할 수 있습니다 :

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

예 : $(this).ancestors().eq(2)->의 부모의 부모 this.


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
downvoter는 아니지만 아마도 최악의 해결책 일 것입니다 (즉, 비효율적).
zatatatata

0

eq를 사용하면 동적 DOM을 가져 오는 것처럼 보이고 .parent (). parent ()를 사용하면 처음에로드 된 DOM을 가져옵니다 (가능한 경우).

나는 onmouseover에 클래스가 적용된 요소에서 둘 다 사용합니다. eq는 클래스를 표시하지만 .parent (). parent ()는 그렇지 않습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.