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

Joh*_*n K 121 jquery

jQuery find(..)遍历方法不包括当前节点 - 它以当前节点的子节点开始.在匹配算法中调用包含当前节点的查找操作的最佳方法是什么?通过文档查看没有任何内容立即跳出来.

Rob*_*ert 144

对于jQuery 1.8及更高版本,您可以使用.addBack().它需要一个选择器,因此您不需要过滤结果:

object.find('selector').addBack('selector')
Run Code Online (Sandbox Code Playgroud)

在jQuery 1.8之前,你一直坚持使用.andSelf()(现已弃用并删除),然后需要过滤:

object.find('selector').andSelf().filter('selector')
Run Code Online (Sandbox Code Playgroud)

  • @ronen一个可以在一行中完成的额外文件?谢谢,但不,谢谢. (15认同)
  • @ prc322一个额外的文件不会打扰我的部署,无论如何将所有的javascript捆绑到一个文件中.一般来说,我更喜欢使用(测试过的)库方法,即使是简单的事情,而不是用我觉得难以阅读的东西混淆我的代码,并为bug带来更多可能性.特别是在这种情况下,恕我直言,需要两次指定"选择器"使封装更加令人满意.因人而异 (6认同)
  • @ circa1983`object.parent().find('selector')`包括`object`的兄弟姐妹及其后代. (6认同)
  • 我把它捆绑为插件jquery.findIncludeSelf,在bower注册.请参阅https://github.com/ronen/jquery.findIncludeSelf (5认同)

Nic*_*ver 41

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

$(selector).find(oSelector).andSelf().filter(oSelector)
//or...
$(selector).find('*').andSelf().filter(oSelector);
Run Code Online (Sandbox Code Playgroud)

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

  • 请记住.andSelf()自v1.8起已被弃用,并替换为.addBack(),它将选择器作为参数.见http://api.jquery.com/addBack/ (17认同)
  • 您甚至在回答此问题之后立即向jquery页面添加了评论http://api.jquery.com/andSelf/#comment-50124533现在这很彻底.太好了!我做了尽职调查并且"喜欢"那个. (7认同)
  • 有趣的是,`nearest(..)`包括当前的DOM元素和树,而所有树的遍历方法如`find(..)`等与当前元素不匹配.就好像jQuery团队在两个操作一起用于完全垂直搜索时,有目的地实现了这些并没有重叠. (3认同)
  • 第二个是令人难以置信的缓慢.第一个只是缓慢. (2认同)

Dmi*_*sov 9

限定

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

然后用

$.findSelf(selector);
Run Code Online (Sandbox Code Playgroud)

代替

$find(selector);
Run Code Online (Sandbox Code Playgroud)

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


Tgr*_*Tgr 5

$('selector').find('otherSelector').add($('selector').filter('otherSelector'))
Run Code Online (Sandbox Code Playgroud)

您可以存储$('selector')在变量中以加快速度。如果您非常需要,您甚至可以为此编写自定义函数:

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

$('selector').andFind('otherSelector')
Run Code Online (Sandbox Code Playgroud)


小智 5

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

//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);
Run Code Online (Sandbox Code Playgroud)