2011-02-15 5 views
3

주어진 클래스에 대해 가장 가까운 (트리에서) 얻는 가장 좋은 방법은 무엇입니까?하지만 부모의 형제가 될 수 있습니다.Jquery 첫 번째 발생 트리가 부모/형제를 트래버스합니다.

나는

<div> 
    ... 
    <div class="errors">errors2</div> 
    <div> 
     ..... 
     <div class="errors">errors1</div> 
     ... 
     <div>...</div> 
     <div> 
      ..... 
      <div class="start"></div>    
     </div>  
    </div> 
</div> 

는 모든 스크립트하지만 정말 나쁜 나던 작품을 만들어 ".start" "errors1"요소 요소에서 시작 싶어.

http://jsfiddle.net/9DfCJ/1/

감사 편집을 할

: 추가는 "..."그 구조가 동적 향상. 요점은 가장 가까운 ".errors"트리를 찾는 것입니다.

답변

1

위대한 질문입니다. 아래 코드는 당신을 위해 작동합니다. .errors의 요소를 찾을 때까지 .start의 각 상위 요소를 반복합니다. 그런 다음 .start에 가장 가까운 .errors 요소의 텍스트를 알립니다.

jQuery(function($){ 

    var $start = $('.start'), 
     $parents = $start.parents(); 

    $parents.each(function(){ 
     var $this = $(this), 
      $thisErrors = $this.find('.errors'), 
      numErrors = $thisErrors.length; 

     if(numErrors){ 
      alert($thisErrors.eq(numErrors-1).text()); 
      return false; 
     } 

    }); 

}); 
+0

아주 좋은 사람입니다. 덕분에 – Luccas

+1

.errors 요소가 .start 파일의 자손이되는 것을 피하기 위해 .errors : not (.start .errors) '에 대한 find selector를 바꾸는 것이 더 좋을 것 같아요. 또는 start 요소의 선택자가 어렵다면. selector는 일치로 리턴하기 전에 jQuery.contains ($ start, $ errorsMatchElement) 유효성 검증을 추가하십시오. – g8M

1

jQuery의 prev() 명령을 조사하십시오. 예를 들어, 찾아 '시작'클래스의 맥락에서, 다음 사용하는 것이 때 이전의 '오류'를 숨길 수 :

$('.start').click(function(){ 
    $(this).prev('.errors').hide(); 
}); 

더 여기 읽기 : http://api.jquery.com/prev/

UPDATE :

중첩되어있는 경우 위로 이동하려면 parent()을 사용하는 것이 더 나을 것입니다. parent() 또한 인수로 선택자를 취합니다. 인수없이 현재 노드의 부모를 가져옵니다. 당신이 트리를 이동하고 모든 오류를 얻고 싶다면

http://api.jquery.com/parent/

+0

이전에는 나무를 오르지 않습니다. 같은 레벨뿐입니다 – Luccas

+0

시도해 보셨습니까? 선택기와 함께'parent() '를 호출 할 수 있습니다 ... – philwinkle

1
$(this).parent().siblings(':first') 
+0

그는 부모 클래스에서 쿼리하는 방법을 찾고 있습니다. 이 경우'$ (this) .parent ('. errors')'; – philwinkle

+0

구조가 다를 수 있다는 말을 잊어 버렸습니다. 요점은 나무에서 가장 가까운 ".errors"를 얻는 것입니다. – Luccas

0

, 당신은 그런 일 할 수있는 : 끝에서

var start = $(".start"), 
    current = start.parent(), 
    parent = current, 
    end_class = "stop", 
    get_errors = function(elt) { 
     return elt.children(".errors"); 
    }, 
    errors = get_errors(current) 

    while (parent = current.parent()) { 

     $.merge(errors, get_errors(parent)); 
     if (parent.hasClass(end_class)) { 
      break; 
     } 
     current = parent; 
    } 

errors 모두 포함됩니다 오류.

상단 div에 end_class을 추가해야합니다.

<div class="stop"> 
    ... 
    <div class="errors">errors2</div> 
    ... 
</div> 
0

내가 뒷조사를했고, 현재 요소에서 시작하여 위로 진행, 즉 선택과 일치하는 첫 번째 요소를 얻을 수있는 무언가를 발견

var myText = $(".start").closest($(".errors")).text(); 

here에 대한 자세한 내용을 읽고 사용할 수

이 코드를 호출하는 이벤트.

1

항목을 jQuery 객체로 반환하여 더 재사용 할 수있는 함수입니다.

이것은 모든 부모를로드하고 매번 find (http://api.jquery.com/find/)를 통해 모든 레벨의 어린이를 확인하는 것이 아니라 한 번에 한 레벨 만 보게되므로 Byran의 대답보다 효율적입니다.

jQuery를로드 한 후 자바 스크립트 파일 또는 스크립트 태그에 함수를 붙여 넣기 만하면됩니다.

$('.start').closestParentsAndSibling('.errors').html('found!'); 

(function($){ 
    $.fn.closestParentsAndSibling = function(search) { 
     // Get the current element's siblings 
     var siblings = this.siblings(search); 

     if (siblings.length != 0) { // Did we get a hit? 
      return siblings.eq(0); 
     } 

     // Traverse up another level 
     var parent = this.parent(); 
     if (parent === undefined || parent.get(0).tagName.toLowerCase() == 'body') { 
      // We reached the body tag or failed to get a parent with no result. 
      // Return the empty siblings tag so as to return an empty jQuery object. 
      return siblings; 
     } 
     // Try again 
     return parent.closestParentsAndSibling(search); 
    }; 
})(jQuery); 
관련 문제