Jquery第一次出现的树遍历父母/兄弟姐妹

时间:2011-02-15 03:57:54

标签: jquery tree siblings parents

给定一个类最接近(向上树)的最佳方法是什么,但它可以是父母的兄弟姐妹。

我希望“errors1”元素以元素“.start”

开头
<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/

由于

编辑: 添加“...”以增强该结构是动态的。关键是找到最近的“.errors”向上树。

6 个答案:

答案 0 :(得分:1)

调查jQuery的prev()命令。例如,要在“开始”类的上下文中查找并隐藏先前的“错误”,您将使用以下内容:

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

在此处阅读更多内容:http://api.jquery.com/prev/

<强>更新

如果嵌套严重,使用parent()向上移动可能会更好。 parent()也将选择器作为参数...没有参数它会抓取当前节点的父节点。

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

答案 1 :(得分:1)

$(this).parent().siblings(':first')

答案 2 :(得分:1)

好问题。下面的代码应该适合你。它循环遍历.start的每个父级,直到找到具有.errors的元素。然后,它会提醒最接近.errors的{​​{1}}元素的文本。

.start

答案 3 :(得分:1)

将项目作为jQuery对象返回的函数,因此它更具可重用性。

这比Byran的回答更有效,因为它一次只查看一个级别,而不是每次都通过find(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 );

答案 4 :(得分: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>

答案 5 :(得分:0)

我做了一些挖掘并找到了一些东西来获得与选择器匹配的第一个元素,从当前元素开始并逐步向上:

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

详细了解here,您可以使用您的活动来调用此代码。