查找不包含在另一个元素中的元素的有效方法
Efficient way to find elements not contained in another element
找到与选择器匹配的元素的最有效方法是什么,而这些元素不在给定DOM节点内(即,我被传递了该节点,不一定能推导出与之匹配的选择器)。到目前为止,我有
var inputs = $("input").filter(function() {
return !$(excludedNode).has(this).length;
});
但我忍不住想,还有比这更好的解决方案,因为尽管没有太多代码,但我怀疑它是否非常有效。
这个怎么样:
var inputs = $("input").filter(function() {
return $(this).closest(excludedNode).length == 0
//or:
return !$(this).closest(excludedNode).length
});
它会找到您想要的元素,然后检查它是否有excludedNode
的父级
我设置了一个jsperf来测试其他人提出的有效建议和另一个想法。
值得注意的是,使用$.has
的方法比使用$.closest
快大约3倍(因为它委托给浏览器的document.element.contains
,而$.closest
进行一些选择器操作并遍历DOM树)。它也比$("div").not("#" + id + " *")
快大约相同的差异。
所以最快的方法是
$("input").filter(function() {
return !$(excludedNode).has(this).length;
});
使用$.closest
,直观上感觉是最快的方式,实际上是最慢的
如果"排除的节点"有一个"id"或其他可以用作选择器的东西,则有:
var inputs = $('input').not('#excluded *');
或
var inputs = $('input').not('#' + node.id + ' *');
$('input').not('#someID input').doSOmething()
var inputs = $('input').not('*', excludedNode);
或
var inputs = $('input').not('*', $(excludedNode));
看起来更好。
相关文章:
- 使用Underscore.js修改json数组中所选元素的更有效方法
- 选择具有值数组的所有元素的最有效方法
- 儿童最安全、最有效的元素去除
- 隐藏具有特定类$.each、for等的元素的有效方法
- JavaScript,数组和函数 - 只有数组的最后一个元素有效
- 输入元素模式属性的Javascript正则表达式在reFiddle上有效,但在页面上无效
- 只有当脚本放置在具有所用ID的元素下方时,JavaScript才有效
- TinyMCE - 允许表格单元格元素作为有效的 html
- Js-一种在DOM中查找第n个元素的更优雅/更有效的方法
- 什么's是在IE8+中添加元素的最有效方法
- addEventListener对所有元素都有效,但有时它会提醒消息两次或多次
- 从任何jquery选择器字符串创建元素的最有效方法
- 更改svg元素只在某些情况下有效
- 如何在Angular中有效地检测元素点击
- Jquery两个元素,切换焦点/点击..有效但滞后
- 选择id中带有双点的元素,错误:“#octo:cat”不是有效的选择器
- 由具有内联 JavaScript 的元素赋值的变量中的“this”对所有元素或已赋值的活动元素有效
- addEventListener 在循环中自动触发 - 或者只有最后一个元素有效
- 如何在web ix表单中通过onChange使每个元素有效
- (美元).attr(“name");只对第一个元素有效