Jquery:为什么我的'find()'方法没有更新?

时间:2012-05-05 06:20:10

标签: jquery

我有一个函数可以找到找到类的长度,但它不起作用总是返回长度是' 0';

我的代码有些问题:任何人都可以通过正确的方式向我提出建议。但我需要使用相同的代码样式结构来实现这一目标。

查看我的代码:

<div id='list'>
  <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>      
  </ul>
    <p></p>
</div>​

function callMe(params){
    $(params.list).click(function(){
       $(this).addClass('c_on');
        var length = $(params.list).find('.c_on').length;
        $('p').text(length)// return always 0, even i clicked no.of list.        
    })
}

$(document).ready(function(){
    var obj = {
        list : $('ul').find('li')      
    }
   callMe(obj);
})

style :

li.c_on{
border:1px solid green;
}

这是小提琴:http://jsfiddle.net/AeGvf/1/

4 个答案:

答案 0 :(得分:4)

您正在使用find

  

获取当前匹配元素集中每个元素的后代,由选择器,jQuery对象或元素过滤。

何时使用filter

  

将匹配元素集合减少到与选择器匹配的元素或通过函数测试。

请注意,find适用于后代,而filter适用于元素本身。您有一个<li>列表,其中没有任何后代,因此find正在搜索空集。你应该这样做:

var length = $(params.list).filter('.c_on').length;

此外,您的params.list已经是jQuery对象,因此您不需要$(params.list),您可以直接使用params.list

function callMe(params){
    params.list.click(function(){
        $(this).addClass('c_on');
        var length = params.list.filter('.c_on').length;
        $('p').text(length);
    });
}

演示:http://jsfiddle.net/ambiguous/uCGaY/

答案 1 :(得分:0)

您的选择方法有点缺陷。改为使用这个:

function callMe(params){
    params.list.click(function(){
       $(this).addClass('c_on');
        var length = $(this).parent().find('.c_on').length;
        $('p').text(length)        
    })
}

Demo

答案 2 :(得分:0)

我发现解决方案工作正常:

function callMe(params){
    $(params.list).click(function(){
       $(this).addClass('c_on');
        var length = $(params.list).filter('.c_on').length;//instead find i used filter. works!
        $('p').text(length)        
    })
}

$(document).ready(function(){
    var obj = {
        list : $('ul').find('li')      
    }
   callMe(obj);
})
​

但直到我想知道为什么find方法不起作用?或者是否有任何限制使用它?或者我的方式是错的..?请回答我找到的任何人。

答案 3 :(得分:0)

以下对我有用。我修改了名称,但是你要求在同一个元素中找到类元素,而不是父元素。

<script>
    function callMe(params) {

        $(params).click(function () {
            $(this).addClass('c_on');
            var suspects = $("#list").find('.c_on');

            $('p').text(suspects.length); // return always 0, even i clicked no.of list.        
        });
}

$(document).ready(function () {

    var obj = $('li');

    callMe(obj);
})
</script>