定位父元素但不知道子节点和父节点之间有多少节点

时间:2013-08-14 14:01:42

标签: javascript jquery

HTML可能是:

<div class="SomeWrapper">
    <img scr="img2.jpg" />
    <img scr="img3.jpg" />
    <img scr="img4.jpg" />
    <img scr="img5.jpg" />
</div>

或者可能是

<div class="SomeWrapper">
    <li><a href="#"><img scr="img1.jpg" /></a></li>
    <li><a href="#"><img scr="img2.jpg" /></a></li>
    <li><a href="#"><img scr="img3.jpg" /></a></li>
    <li><a href="#"><img scr="img4.jpg" /></a></li>
    <li><a href="#"><img scr="img5.jpg" /></a></li>
</div>

我的javascript正在检查已加载的图片。在加载图像时,它想要在“SomeWrapper”div(而不是图像本身)之后将一些效果应用于第一个父元素。

通常我会做类似.parent().parent()的事情,但我并不总是知道图像会有多少父母。

$obj.find("img").load(function(){
    $(this).parent().animate({opacity: '1'},{duration: settings.fadeSpeed});
});

我如何定位正确的父代替上述$(this).parent()

修改$obj恰好是我想要定位的元素

编辑1 : 我不知道父类名的值,在这种情况下是“.SomeWrapper”所以我不能使用$(“。SomeWrapper”)

我可以通过从DOM中获取它来获得该值,但我更喜欢不依赖于硬编码类或id的相对解决方案

编辑2 : 这是实际的文件

https://github.com/ed-lea/jquery-collagePlus/blob/f4fb3f12750394acdd627fc4d2f2aa3a5091e17d/examples/example-size-in-tag.html

我希望将.parent().parent()替换为动态值https://github.com/ed-lea/jquery-collagePlus/blob/f4fb3f12750394acdd627fc4d2f2aa3a5091e17d/jquery.collagePlus.js#L316

5 个答案:

答案 0 :(得分:4)

使用.closest()来执行此操作

  

对于集合中的每个元素,获取与之匹配的第一个元素   选择器通过测试元素本身并遍历其中   DOM树中的祖先。

$(this).closest('.SomeWrapper').parent().animate({opacity: '1'},{duration: settings.fadeSpeed});

答案 1 :(得分:2)

JQuery也有.parents([selector])方法

根据文件:

  

.parents()和.parent()方法类似,除了   后者只在DOM树上运行一个级别。

因此,在您的情况下,您可以使用:

$(this).parents(".SomeWrapper").animate({opacity: '1'},{duration: settings.fadeSpeed});

UPD: 提出改变的问题:

  

编辑:$ obj恰好是我想要定位的元素

怎么样:

$obj.find("img").load(function(){
    $obj.animate({opacity: '1'},{duration: settings.fadeSpeed});
}); 

如果你有循环,你可以使用闭包:

$obj.find("img").load(function(target) {
     return function(){
         target.animate({opacity: '1'},{duration: settings.fadeSpeed});
     }
}($obj)); 

答案 2 :(得分:0)

您需要使用closest()来获取.SomeWrapper元素,然后parent()在DOM中进一步提升1级。试试这个:

$obj.find("img").load(function(){
    $(this).closest('.SomeWrapper').parent().animate({ opacity: '1' },{ duration: settings.fadeSpeed });
});

答案 3 :(得分:0)

假设'somewrapper'的子节点都没有相同的类名,可以使用.closest()方法。

答案 4 :(得分:0)

你可以用这个:

$(this).parents('SomeWrapper')