JQuery 查找具有特定类前缀的第一个父元素

Posted

技术标签:

【中文标题】JQuery 查找具有特定类前缀的第一个父元素【英文标题】:JQuery find first parent element with specific class prefix 【发布时间】:2011-11-19 10:24:20 【问题描述】:

我想获取具有特定类前缀的第一个父级,假设:

<div class="div-a3332"> 
  <div class="div-a89892">
    <p>
      <div class="div-b2">
        <div id="divid">hi</div>
      </div>
    </p>
  </div>
</div>

例如,我当前的元素是#divid,我想找到第一个具有类前缀 div-a 的元素。所以基本上它会选择:

<div class="div-a89892">

【问题讨论】:

停止。使用多个类,而不是将信息组合到一个类中。 'matching' 选择器很慢,而且这种设计不适用于任何修改。 &lt;div class='a'&gt;,然后为div.a 提供规则。实际上,我根本不知道您为什么将 div 放在类名中。 不过,不要将数据合并到类前缀中。这是一种糟糕的模式,可以通过多个类轻松解决。 @StefanKendall:有时您正在处理其他人的第三方垃圾,有时您正在支持无法快速修复的遗留应用程序。糟糕的设计是生活中的事实,这是一个完全合理的问题。 【参考方案1】:

.closest() 与选择器一起使用:

var $div = $('#divid').closest('div[class^="div-a"]');

【讨论】:

顺便说一句,不知道为什么这被否决了。类前缀选择器很脆弱,但它工作。 致 OP:确保您要查找的元素是 DOM 树上某处的父元素,而不是您要查找的对象的兄弟或类似对象(根据文档)。它不是“文档中最接近的位置”,而是“通过处理 DOM 树最接近”。 对我不起作用。另外,我想找到第一个具有特定前缀的元素,不一定是 div 元素。 @Time 然后删除div 元素选择器:$('#divid').closest('[class^="div-a"]')。不过,正如@Stefan 评论的那样,您确实应该使用多个类。 这个选择器需要大量的循环(但它仍然可以很快)。如果你需要支持 IE6、IE7 或 IE8,如果你的 DOM 变得太大,这真的会搞砸你;当执行一定数量的 JS VM 指令时,IE 会抛出“脚本没有响应”对话框,而不是在一定时间后。由于这个原因,我已经看到在 0.1 毫秒内完成的脚本会导致 Internet Explorer 崩溃。【参考方案2】:

Jquery 后来允许你用.parents() 方法找到父母。

因此我建议使用:

var $div = $('#divid').parents('div[class^="div-a"]');

这给出了匹配选择器的所有父节点。要获得匹配选择器的第一个父级,请使用:

var $div = $('#divid').parents('div[class^="div-a"]').eq(0);

对于其他此类 DOM 遍历查询,请查看 traversing the DOM 上的文档。

【讨论】:

答案没有误导性,它只是展示了 .closest() 的另一种替代方法,.parents() 看起来更具可读性,是解决问题的另一种方法。 Closest 是比这更好的解决方案,因为最接近的只会找到第一个匹配项,而父母会发现 DOM 上的所有匹配项。显然使用最接近更有效,虽然我同意,但它不是最好的命名函数。 有趣的是,我最终使用了这个解决方案,因为 .parentsUtil() 没有按我的预期工作。

以上是关于JQuery 查找具有特定类前缀的第一个父元素的主要内容,如果未能解决你的问题,请参考以下文章

如何使用jquery查找元素的第n个父元素

是否有 jQuery 选择器/方法来查找特定的父元素 n 级?

浅谈JQ伪类方法

浅谈JQ伪类方法

为 JQuery 中每个父类的第一个元素添加类

Jquery查找具有特定数据属性的元素[重复]