寻找包含当前节点的jQuery find(..)方法

jQuery find(..)遍历方法不包括当前节点 – 它从当前节点的子节点开始。 调用匹配algorithm中包含当前节点的查找操作的最佳方法是什么? 通过文档查看没有立即跳出来对我。

对于jQuery 1.8及更高版本,您可以使用.addBack() 。 它需要一个select器,所以你不需要过滤结果:

 object.find('selector').addBack('selector') 

在jQuery 1.8之前,你被困在.andSelf() ,(现在已经被弃用和删除),然后需要过滤:

 object.find('selector').andSelf().filter('selector') 

你不能直接这样做,我能想到的最接近的是使用.andSelf()和调用.filter() ,像这样:

 $(selector).find(oSelector).andSelf().filter(oSelector) //or... $(selector).find('*').andSelf().filter(oSelector); 

不幸的是.andSelf()没有select器,这将是方便的。

 $('selector').find('otherSelector').add($('selector').filter('otherSelector')) 

您可以将$('selector')存储在variables中以加速。 如果你需要的话,你甚至可以写一个自定义的函数:

 $.fn.andFind = function(expr) { return this.find(expr).add(this.filter(expr)); }; $('selector').andFind('otherSelector') 

接受的答案是非常低效的,并过滤已经匹配的元素集合。

 //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); 

确定

 $.fn.findSelf = function(selector) { var result = this.find(selector); return (this.is(selector)) ? result.add(this) : result; }; 

然后使用

 $.findSelf(selector); 

代替

 $find(selector); 

可悲的是jQuery没有这个内置的。 真的很奇怪这么多年的发展。 由于.find()的工作方式,我的AJAX处理程序不适用于某些顶级元素。

我知道这是一个古老的问题,但有一个更正确的方法。 如果顺序很重要,比如当你匹配一个select器时,比如: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); }; 

不pipe用什么方法都不是很有效率,但是这是我为了维持正确的秩序而提出的最好的。

如果你想链接正常工作使用下面的代码片段。

 $.fn.findBack = function(expr) { var r = this.find(expr); if (this.is(expr)) r = r.add(this); return this.pushStack(r); }; 

在结束函数的调用之后,它返回#foo元素。

 $('#foo') .findBack('.red') .css('color', 'red') .end() .removeAttr('id'); 

没有定义额外的插件,你坚持这一点。

 $('#foo') .find('.red') .addBack('.red') .css('color', 'red') .end() .end() .removeAttr('id'); 

我认为和andSelf是你想要的:

 obj.find(selector).andSelf() 

请注意,这将始终添加当前节点,无论它是否匹配select器。

如果你严格的看当前的节点,你只需要做

 $(html).filter('selector') 

这是正确的(但悲伤)的事实:

 $(selector).parent().find(oSelector).filter($(selector).find('*')) 

http://jsfiddle.net/SergeJcqmn/MeQb8/2/