jQuery找到自我

这可能听起来很奇怪,但我正在研究一个需要在div中找到元素的插件,或者div本身。

脚本根据用户选择查找元素,但内容(包括标记)是可变的。 所以脚本将按如下方式查找元素:

$('.block').find(selector); // selector set by user 

但是没有一种简单的方法让选择器选择’.block’。 在使用find之前选择父级不是解决方案,因为有多个“.block”元素。

我知道扩展expr[":"]选择器不起作用,因为它只是在寻找孩子。 但是,我确实通过制作一个’:self’选择器找到了一种方法来“ 破解 ”这种方法:

 (function($){ var orig = $.fn.find; $.fn.find = function(sel){ return (sel === ':self') ? this : orig.call(this,sel); } })(jQuery) 

但这似乎有点过头了。 而且每次查找函数都会减慢jQuery的处理速度。 还有另一种方法吗?


谢谢你的答案! 但我最终做到了这一点:

 var b = $('.block'), el = (b.is(selector)) ? b : b.find(selector); 

使用find(’*’)的方法会占用更多的CPU,我建议:

 $('.block').find(selector).add($('.block').filter(selector)); 

我也遇到过这个问题。 我解决了这个问题(基本上是Romans Malinovskis解决方案作为jquery插件):

 $.fn.findAll = function(selector) { return this.find(selector).add(this.filter(selector)); }; 

编辑:

您可以将all选择器’*’与andSelf结合使用,以获得包含其所有子项和子项的元素的选择。 然后你可以在所选择的选择器上筛选()选择。

   
This is a test
  • This is a test
  • This is a test
  • This is a test
  • This is a test
  • This is a test
  • This is a test

应该更改所有.test对象的背景,以及所选的初始div,如果合适的话。 我不确定我的答案的表现。

示例: http : //jsfiddle.net/7A9JJ/2/

编辑或者你可以只做$(’div,div *’)。filter(selector);

从1.8开始就可以

 $('.block').find(selector).addBack(selector); 

我不确定为什么这需要这么复杂。 这可以通过简单的多选择器完成 :

 $(selector + '.block, .block ' + selector); 

没有findfilter ,也没有想到,加上它在许多(大多数?)现代浏览器中更高效(使用jQuery 1.9测试)。

警告

  • 您可能希望事先修剪用户提供的selector ,因为尾随空格在这里有意义;
  • 这个解决方案有点特定于OP的问题,如果目标div的选择器以元素名称开头,即selector + 'th, th ' + selector不会产生有效的选择器,则该解决方案不起作用; 在这种情况下,我建议使用一种更通用的解决方案;
  • 你仍然可以坚持多选择器的方法,一个非常黑,而不是所有推荐的方法,涉及使用:not()伪选择器: 看到工作演示和可怕的,可怕的性能 。

我在下面创建了jquery方法findAll

 $.fn.findAll = function ( selector ) { if ( this.length === 0 ) { return this; } else if ( this.length === 1 ) { return this.filter( selector ).add( this.find( selector ) ); } else { var rtn = this.filter( selector ); this.each( function () { rtn.add( $( this ).find( selector ) ); } ); return rtn; } } 

你可以像下面这样使用它

 $resultSet.findAll(selector)