这可能听起来很奇怪,但我正在开发一个需要在div中找到元素的插件,或者div本身。
脚本根据用户选择查找元素,但内容(包括标记)是可变的。因此脚本将按如下方式查找元素:
$('.block').find(selector); // selector set by user
但是没有一种简单的方法让选择器选择'.block'。使用find之前Selecting the parent不是解决方案,因为有多个'.block'元素。
我知道扩展expr[":"]
选择器不起作用,因为它只是在寻找孩子。但是,我确实找到了一种方法来“duck punch”这种方法,通过制作一个':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);
答案 0 :(得分:10)
使用find('*')的方法会占用更多的CPU,我建议:
$('.block').find(selector).add($('.block').filter(selector));
答案 1 :(得分:6)
<强>编辑:强>
您可以将all选择器'*'与andSelf结合使用,以获得包含其所有子项和子项的元素的选择。然后你可以在所选的选择器上筛选()选择。
<style type="text/css">li {background-color: white;}</style>
<script type="text/javascript">
$(function () {
$('div').find('*').andSelf().filter(selector).css('background-color','blue');
}
</script>
<div>
This is a test
<ul>
<li class="test">This is a test</li>
<li>This is a test</li>
<li class="test">This is a test</li>
<li>This is a test</li>
<li class="test">This is a test</li>
<li>This is a test</li>
</ul>
</div>
如果合适,应更改所有.test对象的背景以及所选的初始div。我不确定我的答案的表现。
示例:http://jsfiddle.net/7A9JJ/2/
修改强> 或者你可以做$('div,div *')。filter(selector);
答案 2 :(得分:2)
自1.8以来你可以做到
$('.block').find(selector).addBack(selector);
答案 3 :(得分:1)
我不确定为什么这需要这么复杂。这可以通过简单的multiple selector:
完成$(selector + '.block, .block ' + selector);
没有find
,filter
和add
可以考虑,而且在许多(大多数?)现代浏览器中使用more performant(使用jQuery 1.9进行测试)。
<强>注意事项强>:
selector
,因为尾随空格在这里有意义; selector + 'th, th ' + selector
不会产生有效的选择器;在这种情况下,我建议使用一种更通用的解决方案; :not()
伪选择器:see working demo和horrible, horrible performance。答案 4 :(得分:0)
我创建了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)