Answers:
对于jQuery 1.8及更高版本,您可以使用.addBack()
。它需要一个选择器,因此您不需要过滤结果:
object.find('selector').addBack('selector')
在jQuery 1.8之前,您受困于.andSelf()
,(现已弃用并删除),然后需要过滤:
object.find('selector').andSelf().filter('selector')
'selector'
两次使封装变得更加理想。YMMV
'selector'
很胖,但是您不必指定两次(如@ronen所述),您不能只使用object.parent().find('selector')
??? 吗?-话虽如此,我喜欢为您提供帮助的lib的想法。
object.parent().find('selector')
包括的兄弟姐妹object
及其后代。
您不能直接执行此操作,我能想到的最接近的是使用.andSelf()
和调用.filter()
,如下所示:
$(selector).find(oSelector).andSelf().filter(oSelector)
//or...
$(selector).find('*').andSelf().filter(oSelector);
不幸的.andSelf()
是没有选择器,这很方便。
closest(..)
将当前DOM元素包括在树上,而将树等所有的遍历方法find(..)
都与当前元素不匹配。似乎当两个操作一起用于完整垂直搜索时,jQuery团队有目的地实现了这些目标而没有重叠。
定义
$.fn.findSelf = function(selector) {
var result = this.find(selector);
this.each(function() {
if ($(this).is(selector)) {
result.add($(this));
}
});
return result;
};
然后使用
$.findSelf(selector);
代替
$find(selector);
遗憾的是,jQuery没有此内置函数。这么多年的发展真的很奇怪。由于.find()的工作原理,我的AJAX处理程序未应用于某些顶级元素。
filter()
,这更有意义。
$('selector').find('otherSelector').add($('selector').filter('otherSelector'))
您可以将其存储$('selector')
在变量中以加快速度。如果您非常需要它,您甚至可以为此编写一个自定义函数:
$.fn.andFind = function(expr) {
return this.find(expr).add(this.filter(expr));
};
$('selector').andFind('otherSelector')
$('selector').find('otherSelector').add($('otherSelector'))
,您现在拥有的等同于.andSelf()
。最后,.andFind()
不要根据表达式进行过滤,您需要.add($(this).filter(expr))
:)
$('selector')
用其他方法来获取jQuery对象(如果不是通过选择器开始的意思)来代替它,则add()
可以处理任何内容$()
。
$('selector')
可能是$('selector').children('filter').closest('.class').last()
……可能处于一个链中,并且您不知道要添加的对象是什么,因此通用解决方案应该像过滤器一样使用先前的对象:)
this
是调用插件的任何jQuery对象。也可能是呼叫链的结果。
如果您希望链接正常工作,请使用以下代码段。
$.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');
this
一个以上的元素,this.is()
但只有其中一个匹配。
我知道这是一个老问题,但是有一个更正确的方法。如果顺序很重要,例如,当您匹配像这样的选择器时:first
,我写了一个小函数,它将返回与find()
实际包含当前元素集完全相同的结果:
$.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);
};
无论如何它都不会高效,但是这是我维护正确订单的最佳方法。
这是正确的(但可悲的)事实:
$(selector).parent().find(oSelector).filter($(selector).find('*'))
$(selector)
在所有情况下将其自身从集合中删除。