Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jQuery查找自我_Jquery_Jquery Selectors - Fatal编程技术网

jQuery查找自我

jQuery查找自我,jquery,jquery-selectors,Jquery,Jquery Selectors,这听起来可能有点奇怪,但我正在开发一个插件,它需要在div或div本身中查找元素 脚本根据用户选择查找元素,但内容(包括标记)是可变的。因此,脚本将按如下方式查找元素: $('.block').find(selector); // selector set by user 但是让选择器选择“.block”并不是一种简单的方法。在使用之前,查找不是一个解决方案,因为有多个“.block”元素 我知道扩展expr[“:”]选择器将不起作用,因为它只查找孩子。但是,我确实找到了一种“此方法”的方法,

这听起来可能有点奇怪,但我正在开发一个插件,它需要在div或div本身中查找元素

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

$('.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
    不会生成有效的选择器,则此解决方案将不起作用;在这种情况下,我建议使用更通用的解决方案之一
  • 您仍然可以坚持使用多选择器方法,这种方法非常粗糙,根本不推荐使用
    :NOT()
    伪选择器:and
    • 从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