jQuery find(..)遍历方法不包含当前节点 - 它以当前节点的子节点开头。在匹配算法中调用包含当前节点的查找操作的最佳方法是什么?通过文档查看没有任何内容立即跳出来。
答案 0 :(得分:140)
对于jQuery 1.8及更高版本,您可以使用.addBack()
。它需要一个选择器,因此您不需要过滤结果:
object.find('selector').addBack('selector')
在jQuery 1.8之前,您遇到了.andSelf()
,(现已弃用并已删除),然后需要进行过滤:
object.find('selector').andSelf().filter('selector')
答案 1 :(得分:41)
你不能直接这样做,我能想到的最接近的是使用.andSelf()
并调用.filter()
,如下所示:
$(selector).find(oSelector).andSelf().filter(oSelector)
//or...
$(selector).find('*').andSelf().filter(oSelector);
不幸的是.andSelf()
没有使用选择器,这会很方便。
答案 2 :(得分:8)
定义
$.fn.findSelf = function(selector) {
var result = this.find(selector);
return (this.is(selector)) ?
result.add(this) : result;
};
然后使用
$.findSelf(selector);
而不是
$find(selector);
可悲的是,jQuery没有这个内置功能。这么多年的发展真的很奇怪。由于.find()的工作原理,我的AJAX处理程序并未应用于某些顶级元素。
答案 3 :(得分:4)
$('selector').find('otherSelector').add($('selector').filter('otherSelector'))
您可以将$('selector')
存储在变量中以进行加速。如果您需要它,您甚至可以为此编写自定义函数:
$.fn.andFind = function(expr) {
return this.find(expr).add(this.filter(expr));
};
$('selector').andFind('otherSelector')
答案 4 :(得分:4)
接受的答案非常低效,并过滤了已经匹配的元素集。
//find descendants that match the selector
var $selection = $context.find(selector);
//filter the parent/context based on the selector and add it
$selection = $selection.add($context.filter(selector);
答案 5 :(得分:2)
我知道这是一个老问题,但有更正确的方法。如果顺序很重要,例如当你匹配像:first
这样的选择器时,我写了一个小函数,它将返回完全相同的结果,就像find()
实际包含当前元素集一样: / p>
$.fn.findAll = function(selector) {
var $result = $();
for(var i = 0; i < this.length; i++) {
$result = $result.add(this.eq(i).filter(selector));
$result = $result.add(this.eq(i).find(selector));
}
return $result.filter(selector);
};
无论如何都不会有效率,但这是我提出的维持正确秩序的最佳方式。
答案 6 :(得分:2)
如果您希望链接正常工作,请使用下面的代码段。
$.fn.findBack = function(expr) {
var r = this.find(expr);
if (this.is(expr)) r = r.add(this);
return this.pushStack(r);
};
调用end函数后,它返回#foo元素。
$('#foo')
.findBack('.red')
.css('color', 'red')
.end()
.removeAttr('id');
如果没有定义额外的插件,你就会陷入困境。
$('#foo')
.find('.red')
.addBack('.red')
.css('color', 'red')
.end()
.end()
.removeAttr('id');
答案 7 :(得分:1)
答案 8 :(得分:1)
如果您正在严格查看当前节点,则只需执行
即可$(html).filter('selector')
答案 9 :(得分:0)
如果您正在寻找正好一个元素,无论是当前元素还是其中的元素,您都可以使用:
result = elem.is(selector) ? elem : elem.find(selector);
如果您正在寻找多个元素,您可以使用:
result = elem.filter(selector).add(elem.find(selector));
使用andSelf
/ andBack
非常罕见,不确定原因。也许是因为一些人在我之前提到的性能问题。
(我现在注意到 Tgr 已经提供了第二个解决方案)
答案 10 :(得分:0)
我正试图找到一个不会重复自身的解决方案(即不要两次输入相同的选择器)。
这个很小的jQuery扩展做到了:
jQuery.fn.findWithSelf = function(...args) {
return this.pushStack(this.find(...args).add(this.filter(...args)));
};
它将find()
(仅后代)与filter()
(仅当前集)组合在一起,并支持所有都吃的参数。 pushStack()
允许.end()
正常工作。
像这样使用:
$(element).findWithSelf('.target')
答案 11 :(得分:-2)
这是正确的(但悲伤的)真相:
$(selector).parent().find(oSelector).filter($(selector).find('*'))