2011-02-15 53 views
3

給定一個類最近的(最多的樹),但它可以是父母的兄弟姐妹。Jquery第一個出現樹遍歷父母/兄弟

我想「errors1」元素開始元素「啓動」

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

做了一個腳本,但它真的不好,不工作的。

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

感謝

編輯: 添加 「...」,以增強該結構是動態的。重點是找到最接近的「錯誤」樹。

回答

1

偉大的問題。下面的代碼應該適合你。它在.start的每個父項上循環,直到找到包含.errors的元素。然後它會提示最接近.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; 
     } 

    }); 

}); 
1

調查jQuery的prev()命令。例如,要查找和隱藏以前的「錯誤」時,在「開始」級的情況下,你可以使用下列內容:

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

在這裏閱讀更多:http://api.jquery.com/prev/

UPDATE:

如果使用parent()進行嚴重嵌套,則可能會有更好的運氣向上穿過。 parent()也將選擇器作爲參數...沒有參數,它抓住當前節點的父節點。

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

+0

prev不工作爬樹。只有相同的水平 – Luccas 2011-02-15 04:21:55

+0

你試過了嗎?你可以用選擇器調用`parent()`... – philwinkle 2011-02-15 04:22:45

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

他正在尋找一種方法來從父類的類進行查詢。在這種情況下`$(this).parent('。errors')`; – philwinkle 2011-02-15 04:25:48

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將包含所有錯誤。

你將不得不將end_class添加到您的頂部div。

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

我做了一些挖掘和發現的東西來獲取該選擇相匹配的第一個元素,在當前元素開始,前進了:

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

閱讀更多關於它here,你可以使用你的事件來調用這個代碼。

1

將項目作爲jQuery對象返回的一個函數,因此它更具可重用性。

這比Byran的答案更有效率,因爲它一次只查看一個級別,而不是每次加載所有父母並通過查找(http://api.jquery.com/find/)檢查所有級別的孩子。

要使用,只需將該函數粘貼到jQuery加載後的JavaScript文件或腳本標記中即可。

$('.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); 
相關問題