为什么jQuery选择器("parent>child")会跳过子项

Why is the jQuery selector, ("parent > child"), skipping children?

本文关键字:quot parent 选择器 jQuery 为什么 gt child      更新时间:2023-09-26

我不明白为什么我的选择器会跳过子项。我很确定这是因为我没有完全理解("parent>child"(选择器,但我不知道除了问别人,我还能做些什么来更好地理解这一点。我一直在阅读jQuery文档,搜索谷歌和stackoverflow。我找到了有关选择器的信息,但似乎没有什么能回答我的问题。

请查看以下jsfiddle:

https://jsfiddle.net/49kboqze/

这是我的jQuery代码:

if($("div.thumbdiv").length)  {
$("a.thumblink").each(function(index) {
    var $href = $(this).attr("href");
    var $title = $(this).attr("title");
    var $alt = $(this).find($("img.thumbnail")).attr("alt");
    $(this).parents("div.imggallery > div").css("outline", "solid red 1px");
});
}

当我运行以下代码时:

var parentEls = $(this).parents()
        .map(function() {
         return $(this).attr("class");
         })
        .get()
        .join( ", " );
    console.log(  parentEls );

它返回元素的所有父类。因此,我100%确信,类为thumbdiv的div是它的直接父级,它的"祖父母"是类为imggallery的div。到目前为止,无论是在我的头脑中还是在实践中,一切似乎都有意义。这是我不得不举起双手的地方;thumbdiv有几个兄弟,其中一个就在它的正上方,这个div有一个mainimgdiv类。mainimgdiv也是imggallery的一个孩子,事实上,它是第一个孩子。所以我一辈子都不明白,当我到达父目录div.imggallery,然后从那一点使用选择器时,它为什么跳过它的第一个子目录,回到它的第二个子目录div.thumbdiv。这甚至不是$(this(的位置(这是.thumbdv的唯一子目录a.thumblink(。

我认为这可能与.each函数有关,所以我尝试在条件之外使用选择器,但它仍然以相同的方式执行。

我不知所措,似乎想不通。我在这里错过了什么?

非常感谢您抽出时间!

当你有这个:

$(this).parents("div.imggallery > div")

您所说的是"选择this元素的所有祖先,这些祖先恰好也与选择器"div.imggallery > div"匹配"。

您的mainimgdivdiv是,而不是您的锚点this元素的祖先,因此它不包含在选择中。换句话说,不是您的选择器在"跳过"子项,而是您使用了.parents()

如果你的意图是通过DOM导航从点击的链接到mainimgdiv,那么你可以这样做:

$(this).closest("div.imggallery").find(".mainimgdiv")

也就是说,使用.closest()通过树向上导航到祖先imggallery,然后从那里使用.find()向下导航回mainimgdiv元素。

简单地说,jQuery选择器是以CSS选择器为模型的。

$(".parent > .child")

以上将选择直系亲属子女,但不选择子女的子女。

看看这个演示:http://jsbin.com/duhadikiji/edit?html,js,输出