使用 jQuery 检查任何祖先是不是有一个类

Posted

技术标签:

【中文标题】使用 jQuery 检查任何祖先是不是有一个类【英文标题】:Check if any ancestor has a class using jQuery使用 jQuery 检查任何祖先是否有一个类 【发布时间】:2013-06-09 16:58:07 【问题描述】:

在 jQuery 中有什么方法可以检查 any 父母、祖父母、曾祖父母是否有一个类。

我有一个标记结构,让我在代码中做这种事情:

$(elem).parent().parent().parent().parent().hasClass('left')

但是,为了代码的可读性,我想避免这种事情。有没有办法说“任何父母/祖父母/曾祖父母都有这个班级”?

我正在使用 jQuery 1.7.2。

【问题讨论】:

***.com/questions/16863917/… - 如果有人想在没有 jQuery 的情况下这样做 【参考方案1】:

有很多方法可以过滤元素祖先。

if ($elem.closest('.parentClass').length /* > 0*/) /*...*/
if ($elem.parents('.parentClass').length /* > 0*/) /*...*/
if ($elem.parents().hasClass('parentClass')) /*...*/
if ($('.parentClass').has($elem).length /* > 0*/) /*...*/
if ($elem.is('.parentClass *')) /*...*/ 

小心closest() 方法在检查选择器时包含元素本身。

或者,如果您有一个与$elem 匹配的唯一选择器,例如#myElem,您可以使用:

if ($('.parentClass:has(#myElem)').length /* > 0*/) /*...*/
if(document.querySelector('.parentClass #myElem')) /*...*/

如果您想根据其任何祖先类匹配元素仅用于样式设置,只需使用 CSS 规则

.parentClass #myElem  /* CSS property set */ 

【讨论】:

我可能会冒昧地说(未经测试)这种方法更好。 Elem.parents 将遍历整个父 dom 结构,其中最接近()应该(可能)在找到最近的父元素时停止,因此效率更高。这是一个没有根据的猜测。我通常使用最接近()。听起来我为我的博客找到了一个新的研究主题! :P @dudewad 是的,但它是最近的。我的意思是在较旧的 jq 版本中,AFAIK 并非如此。使用最接近()的第一个匹配父级没有中断父级循环,但现在它是。 (不知道从哪个 jq 版本开始,但我很确定这句话是正确的) 很高兴知道,感谢您的信息。奇怪的是他们不会从第一个版本中构建突破。 没有找到父母时,parents()比closest()快jsperf.com/closest-vs-parents-foobar @Alex 确实很有趣,谢谢输入!顺便说一句,重新阅读问题,Is there any way in jQuery to check if any parent,...closest() 检查元素本身,所以这并不是真正回答问题,OP 可能希望明确排除元素本身,所以,答案是使用 .parents()【参考方案2】:

您可以使用parents 方法和指定的.class 选择器并检查它们是否匹配:

if ($elem.parents('.left').length != 0) 
    //someone has this class

【讨论】:

【参考方案3】:
if ($elem.parents('.left').length) 


【讨论】:

谢谢,正是我需要的!记录一下,虽然将.length 视为真值的做法在 JS 中相当多产,但.length > 0 更清晰、更容易理解 这里是 jQuery .parents() 文档的链接

以上是关于使用 jQuery 检查任何祖先是不是有一个类的主要内容,如果未能解决你的问题,请参考以下文章

jquery - 如何检查元素是不是附加了任何类

jQuery检查表单输入是不是为空,除了一个

检查是不是使用 jQuery 检查了复选框,然后将一个类添加到最近的 td

JQuery 检查类是不是匹配

jQuery hasClass() - 检查多个类

jQuery中最近的祖先节点