如何高效检测元素是否属于指定jQuery集合?
当然可以!更高效的实现方式在这里
完全不用构造整个jQuery集合就能完成检测,核心思路是直接针对目标元素验证两个关键条件——毕竟$(selector, containerElement)本质上就是在container的后代(不含自身,除非用特殊写法)中筛选匹配selector的元素,我们只需要对目标元素单独做这两项验证即可,避免了遍历所有匹配元素、创建jQuery对象的额外开销。
具体实现步骤
你可以通过以下两个快速检查来完成判断:
- 目标元素是否匹配指定的selector:用jQuery封装的
$.matches()方法(兼容各浏览器,内部和jQuery选择器用的是同一个Sizzle引擎,结果完全一致)。 - 目标元素是否是containerElement的后代元素(或者就是containerElement本身,如果你的场景需要包含它的话):用jQuery的
$.contains()方法,它专门用来检查DOM元素的包含关系。
代码示例
场景1:仅检测container的后代元素(和$(selector, container)行为完全一致)
function isElementInCollection(el, selector, container) { return $.contains(container, el) && $.matches(el, selector); }
场景2:需要包含container本身(如果它匹配selector的话)
如果你实际需求是类似$(container).find(selector).addBack(selector)的效果,就加上对container本身的判断:
function isElementInCollection(el, selector, container) { return $.matches(el, selector) && (el === container || $.contains(container, el)); }
为什么这更高效?
对比$(selector, container).is(el):
- 原方法会先遍历container下所有匹配selector的元素,创建一个包含所有匹配项的jQuery对象,再检查目标元素是否在这个集合里,时间复杂度是O(n)(n为匹配元素的数量)。
- 我们的方法只针对目标元素做两次O(1)的快速检查,完全跳过了遍历和对象创建的开销,在container下元素较多时,性能提升非常明显。
注意事项
- 对于jQuery旧版本(比如1.8及以前),
$.matches()可能不存在,你可以用$.fn.matches.call(el, selector)或者$.matchesSelector(el, selector)来替代,效果是一样的。 - 所有jQuery支持的特殊选择器语法(比如
:visible、:has()、属性选择器等)都能被正确处理,因为底层用的是和jQuery核心一致的选择器引擎。
内容的提问来源于stack exchange,提问作者GetFree
相关产品推荐
相关产品推荐

