jQuery查找自我
这听起来可能有点奇怪,但我正在开发一个插件,它需要在div或div本身中查找元素 脚本根据用户选择查找元素,但内容(包括标记)是可变的。因此,脚本将按如下方式查找元素:jQuery查找自我,jquery,jquery-selectors,Jquery,Jquery Selectors,这听起来可能有点奇怪,但我正在开发一个插件,它需要在div或div本身中查找元素 脚本根据用户选择查找元素,但内容(包括标记)是可变的。因此,脚本将按如下方式查找元素: $('.block').find(selector); // selector set by user 但是让选择器选择“.block”并不是一种简单的方法。在使用之前,查找不是一个解决方案,因为有多个“.block”元素 我知道扩展expr[“:”]选择器将不起作用,因为它只查找孩子。但是,我确实找到了一种“此方法”的方法,
$('.block').find(selector); // selector set by user
但是让选择器选择“.block”并不是一种简单的方法。在使用之前,查找不是一个解决方案,因为有多个“.block”元素
我知道扩展expr[“:”]
选择器将不起作用,因为它只查找孩子。但是,我确实找到了一种“此方法”的方法,方法是制作一个“:self”选择器:
(function($){
var orig = $.fn.find;
$.fn.find = function(sel){
return (sel === ':self') ? this : orig.call(this,sel);
}
})(jQuery)
但这似乎有点过头了。而且它会让jQuery的处理速度在每个find函数中都慢一点。还有别的办法吗
谢谢你的回答!但我最终还是这样做了:
var b = $('.block'),
el = (b.is(selector)) ? b : b.find(selector);
编辑: 您可以将所有选择器“*”与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>
li{背景色:白色;}
$(函数(){
$('div').find('*').andSelf().filter(selector).css('background-color','blue');
}
这是一个测试
- 这是一项测试
- 这是一个测试
- 这是一项测试
- 这是一个测试
- 这是一项测试
- 这是一个测试
如果合适的话,应该更改所有.test对象的背景,以及选择的初始div。但是我不确定我的答案的性能
例如:
编辑
或者你可以只做$('div,div*')。过滤器(选择器);使用find('*')的方法将占用更多的CPU,我建议:
$('.block').find(selector).add($('.block').filter(selector));
我创建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)
你可以像下面那样使用它
$.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)
我也遇到了这个问题。我这样解决了它(基本上是作为jquery插件的Romans Malinovski解决方案):
我不知道为什么这需要这么复杂。这一切都可以通过一个简单的: 没有
find
,filter
,也没有add
可供考虑,而且在许多(大多数?)现代浏览器中(使用jQuery 1.9测试)都有这种功能
注意事项:
- 您可能需要事先修剪用户提供的
,因为尾随空格在这里有意义选择器
- 此解决方案在某种程度上特定于OP的问题,如果目标div的选择器以元素名称开头,即
不会生成有效的选择器,则此解决方案将不起作用;在这种情况下,我建议使用更通用的解决方案之一selector+'th,th'+selector
- 您仍然可以坚持使用多选择器方法,这种方法非常粗糙,根本不推荐使用
伪选择器:and:NOT()
- 从1.8开始,您可以
$('.block').find(selector).addBack(selector);
在选择器调用之前使用
.add(this)
如何?如果不进行测试,这会不会将其添加到find可以迭代的“可能答案”列表中?@Brad我认为中没有定义该。虽然这是一个不错的想法!但它确实让我考虑尝试.andSelf()
,但这也不起作用=(@fudgey:我会说你有最好的解决方案。从各方面考虑,这个钩子并不是那么容易上钩,但我可以推荐return(this.is(sel)?this:orig.call(this,sel));
稍微激烈一点,但不会限制你使用“:self”。@Brad对不起,我还没有喝到咖啡因,那有什么作用?我只想加上“:self”这不应该是$(this).是(sel)
?但它仍然没有记录这是如何更好?@fudgey:假设您有一个div,应用了类“foo”(
)。这个元素存储为el
。传统上,执行$(el).查找('.foo'))
不会返回div,但只返回foo类的子元素。通过添加.is()
检查,您可以返回匹配中的当前元素,因为el实际上会应用foo(例如$(el).find('.foo')=el
)。--我不知道您是否想继续使用“:self”不管是否,它只是让您可以灵活地使用“传统jQuery选择器”并将其应用于当前选定的元素,如果它被替换为刚才的li:first
,那么它将使div以及第一个li
变为蓝色,这是不需要的。@fudgey啊!我明白了。给我一点时间。很好…有点复杂,但它仍然有效。谢谢!+1谢谢!但我想你的意思是add()
。无论如何,我最终还是这样做了:varb=$('.block'),el=(b.is(选择器))?b:b.find(选择器);
对于更简单、性能更高的通用解决方案:我更喜欢这种方法。它很优雅,而且我认为它比上面提到的“*”解决方案更快,尽管我没有做任何测试。我还认为类似这样的功能应该在jQuery核心中。您不需要不同的this.length情况,尤其是length>1的情况ed.Omnimike的实现工作正常,可能效率很高:这是一个很好的解决方案,但由于用户提供了选择器,它可能是'。block'
…所以'。block.block'
不起作用。@Mottie,是的,实际上是这样的:我误解了你的担心吗?在我的例子中,我使用的是表头,而不是de>.block
我需要th
,因此选择器也不能是th
().啊,那是另一个问题。:]我回答的是一个问题,选择器
是用户输入,'.block'
是包含div的目标的选择器。其他答案在您自己的目标选择器以元素名称开头的情况下更通用/合适,我可以将答案更新为c