Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery中是否有一种方法可以从元素向上遍历dom树,并在其父元素之前检查选择器_Javascript_Jquery - Fatal编程技术网

Javascript jQuery中是否有一种方法可以从元素向上遍历dom树,并在其父元素之前检查选择器

Javascript jQuery中是否有一种方法可以从元素向上遍历dom树,并在其父元素之前检查选择器,javascript,jquery,Javascript,Jquery,例如: <div class="mainWrapper"> <div class="FirstLayer"> <input class="foo" value="foo" /> </div> <div class="SecondLayer"> <div class="thirdLayer"> <input class="fee" />

例如:

<div class="mainWrapper">
    <div class="FirstLayer">
        <input class="foo" value="foo" />
    </div>

    <div class="SecondLayer">
        <div class="thirdLayer">
            <input class="fee" />
        </div>
    </div>
</div>

假设我将
input.fee
作为jQuery对象,并且我还需要获取
input.foo
的值。 现在我知道我可以使用多种方法,比如
$(this).parents(':eq(2)').find('.foo')
,但我想在具有不同级别和数量节点的布局上使用这种方法。 因此,我想知道是否有一种方法可以简单地从
.fee
开始,一直到找到第一个匹配元素为止,
.prevAll()
似乎并没有这样做。有许多
.foo
.fee
元素,我特别需要上下文中
.fee
上方的第一个元素。

使用选择器并执行您所需的操作-查找作为某事物父元素的第一个匹配元素。还有一种方法确实需要一个选择器来过滤元素祖先。使用那些与
find
方法相结合的方法,您就可以进行设置了

$('input.fee')。最接近的('.mainWrapper')。查找('.foo')
会起作用,不是吗?

这个怎么样:

$('input.fee').closest(':has("input.foo")')
              .find('input.foo').val();
这是我要玩的。)


更新:尊敬@VisioN-当然,
家长:第一个
被最近的取代了

这将选择以前的输入。foo

// self might have siblings that are input.foo so include in selection
$( $("input.fee").parentsUntil(":has(input.foo)").andSelf()

        // if input.off is sibling of input.fee then nothing will
        // be returned from parentsUntil. This is the only time input.fee
        // will be selected by last(). Reverse makes sure self is at index 0
        .get().reverse() )

        // last => closest element
        .last()                 

        //fetch siblings that contain or are input.foo elements
        .prevAll(":has(input.foo), input.foo") 

        // first is closest
        .first() 

        // return jQuery object with all descendants
        .find("*")         

        // include Self in case it is an input.foo element 
        .andSelf() 

        .filter("input.foo")

        // return value of first matching element
        .val() 


您是否可以显示一个包含多个
foo
fee
字段的示例,因为遍历很可能不同。您可以使用
最接近的
方法,
$(this).最接近的('.mainWrapper')。查找('.foo'))
上升永远不会到达
foo
,因为它不是
fee
的祖先。它是
fee
@Asad的祖先的兄弟姐妹,所以没有一个函数会简单地上升dom树检查类的所有元素,不管是否是祖先?@LaserBeak对。它之所以称为树是有原因的-你不能厌恶并期望到达树的所有枝叶。不幸的是,这不是他真正需要的。但是
foo
不是
fee
的父项,它是父项的子项。没有否决你,但是
最近的
在这里只能与
:has
组合使用-它遍历DOM树,但确实如此不要往下看每一步。)而不是应用
:首先
选择器,你最好使用
最近的()
方法。@VisioN,但当然。)被
:has
选择器弄糊涂了。太好了,我被卡住了,因为我没有想到
:has
,而是错误地尝试了
。最近的('*input.foo'))
+1对于一个很好的答案:-)这不会用input.foo选择上一个div。看看fiddle。我认为它可能会遍历父类,但当将它们与选择器匹配时,它必须从索引为0的父类开始。@Bruno是的,我认为最好的解决方案是使用新的jquery方法,可以调用。nearest(),这将遍历回doing.prev()检查选择器,当不再有prev()时,它将转到parent()并继续执行prev()再次强调。如果在.firstlayer和.secondlayer之间有一个元素,这将不起作用。请参见,在这种情况下它也不起作用。这个答案实际上与公认的答案一样好,只是每个答案都比另一个更好地处理不同的布局角情况,但是对于任何两个答案,布局都可以很容易地完成,从而使它们失败。我重复这一代查找最近元素的一般解决方案是创建一个新的jquery方法,该方法将prev()与parent()相结合正如我在对接受答案的评论中所描述的。哇,你上一个版本做得很好,到目前为止,它通过了所有的测试,但我仍然发现这个版本失败@Nelson我知道我不会得到更多的分数:)但是有机会检查上面的作品。如果工作量太大,不要麻烦,只是出于兴趣。是的,你的最终版本是有效的ng对于迄今为止发布的所有小提琴,祝贺:-)