jQuery找到自我

时间:2011-03-15 13:59:27

标签: jquery jquery-selectors

这可能听起来很奇怪,但我正在开发一个需要在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);

5 个答案:

答案 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);

没有findfilteradd可以考虑,而且在许多(大多数?)现代浏览器中使用more performant(使用jQuery 1.9进行测试)。

<强>注意事项

  • 您可能希望事先修剪用户提供的selector,因为尾随空格在这里有意义;
  • 这个解决方案在某种程度上特定于OP的问题,如果目标div的选择器以元素名称开头,则无效,即selector + 'th, th ' + selector不会产生有效的选择器;在这种情况下,我建议使用一种更通用的解决方案;
  • 你仍然可以坚持采用多选择方法,而不是所有推荐的方法都涉及使用:not()伪选择器:see working demohorrible, 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)