【问题标题】:jQuery: find closest element that is not necessarily a parentjQuery:找到不一定是父元素的最近元素
【发布时间】:2023-03-20 15:02:01
【问题描述】:

我很清楚 closest() 函数“遍历 DOM 树,直到找到与提供的选择器匹配”。但是,有没有办法让这个函数从定义的点开始搜索所有元素及其子元素?

<ul id="one" class="level-1">
  <li class="item-i">I</li>
  <li id="ii" class="item-ii">II
  <ul class="level-2">
    <li class="item-a">A</li>
    <li class="item-b">B
      <ul class="level-3">
        <li class="item-1">1</li>
        <li class="item-2">2</li>
        <li class="item-3">3</li>
      </ul>
    </li>
    <li class="item-c">C</li>
  </ul>
  </li>
  <li class="item-iii">III</li>
</ul>

如果我选择一个类为item-iii 的元素,并想返回一个类为item-3 的元素,选择器会是什么样子?如果我正确理解了closest(),它将上升到 DOM 树,但从不检查是否有任何元素具有与第二个选择器匹配的子元素。

【问题讨论】:

  • 不确定您在寻找什么。您是否正在尝试执行类似“找到与我所在的 ul 相同的 item-3 类的元素?如果是这样,我会使用 parent 去你想去的地方,然后使用find
  • @JacobM 我也这么认为,但改用:$(this).closest('ul').find('.item-3')
  • 你不能只从顶部搜索并使用find()吗? $("body").find(".item-3");
  • Ciaran:这相当于只做$('.item-3')
  • A. Wolff:这会表现得有点不同,因为如果他选择的初始元素恰好位于不是顶级元素的 ul 中怎么办?我正在设想使用parent 来达到足够高的水平以确保您达到您想要的水平,然后使用find

标签: jquery html dom


【解决方案1】:

在所有父元素中搜索 .item-3 元素,然后获取其中的第一个(最接近的)元素,然后在最近的具有此类元素的父元素中找到实际的 .item-3 元素,这将是无效的,但可以做到像这样:

$(this).parents(':has(.item-3)').first().find('.item-3');

FIDDLE

如果它只是在兄弟 LI 中,它可能会更有效

$(this).siblings(':has(.item-3)').first().find('.item-3');

FIDDLE

等等,越具体,通常越有效。

它甚至可以与 closest(); 一起使用

$(this).closest(':has(.item-3)').find('.item-3');

FIDDLE

【讨论】:

  • 正是我想要的。没有想到将find() 用于最接近的元素。第三个选项效果最好。谢谢!
  • 还有一个问题,有没有办法限制它搜索高于指定元素的元素(在你的情况下为$this)?
  • 是的,您可以使用$(this).parent().closest(':has(.item-3)').find('.item-3');,因为最接近() 从当前元素开始,这将使它从父元素开始。
  • 作为旁注,我通常会避免使用parents()(带有s),因为它非常低效。
  • 但是parent() 只返回直接父级,如果它是上面某个地方的第三个父级,因为它的子级包含所需的类呢?
猜你喜欢
  • 2013-05-27
  • 2011-10-24
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
相关资源
最近更新 更多