寻找包含当前节点的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('*'))