each()和prev()可以一起使用吗?

时间:2012-04-18 17:47:41

标签: jquery each

我的代码中有一些div,我想循环检查实际的最后一个。

为什么这不起作用?

<div class="tarefa">1</div>
<div class="tarefa">2</div>
<div class="tarefa">3</div>

<script>
    $(function() {

        i = 0 ;  
        $('.tarefa').each(function(index) {
            i++;
            if($(this).css("left") == $(this).prev('.tarefa').css("left")){
                alert(i);
            }
        });
    });
</script>

$(this).prev('.tarefa').css("left")始终未定义。

3 个答案:

答案 0 :(得分:2)

如果你已经包含了HTML,那么我们可以直接回答。我发现您的代码存在两个潜在问题。

1)当比较.each()中的第一项时,可能没有.prev(),所以你要求空的jQuery对象.css("left")。这将是最好的未定义,可能会失败,但通常不是一个好主意。

2)如果你的所有.tarefa个对象都不是没有干预对象的直接兄弟姐妹,那么$(this).prev('.tarefa')就没有达到预期效果。

如果你检查jQuery doc for .prev(),只有当它与那个班级相匹配时,它才能获得前一个兄弟姐妹。它不会获取jQuery对象中的上一个项目,因此如果您的.tarefa对象不是彼此的直接兄弟,则代码将无法按预期工作。

您可以针对此版本的两个问题修复代码:

$(function() {

    i = 0 ;  
    var items = $('.tarefa');
    items.each(function(index) {
        i++;
        if(index > 0 && $(this).css("left") == items.eq(index-1).css("left")){
            alert(i);
        }
    });
});

稍后编辑:

使用您在评论中添加的HTML,您的原始代码将真正起作用。第一次遍历.each()将获得.prev()CSS值的未定义值,但它将适当地使您的比较失败并且您的原始代码将实际工作。我不推荐它,因为这是一种更安全的方式,也可能表现得更好。

答案 1 :(得分:0)

第一次循环运行时,当this引用DOM中具有类tarefa的第一个元素时,之前没有类tarefa的元素 - 因此{{1不会选择任何东西。

答案 2 :(得分:0)

您应该能够一起使用它们。这个例子有效:

<script type="text/javascript">
    ​$(function(){
        $(".test").each(function(index){
            if (index){
                alert($(this).prev().text());
            }            
        });        
    });​
</script>
​<div class="test" style="background-color:yellow;">Test 1</div>
<div class="test" style="background-color:blue;">Test 2</div>
<div class="test" style="background-color:green;">Test 3</div>​

这是jsFiddle