-2

我的代码中有一些 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")总是不确定的。

4

3 回答 3

2

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

1)当比较 .each() 中的第一项时,可能没有 .prev() 所以你要求.css("left")一个空的 jQuery 对象。这充其量是未定义的,可能无法通过平等测试,但通常不是一个好主意。

2)如果您的所有.tarefa对象都不是没有中间对象的直接兄弟,那么$(this).prev('.tarefa')就没有按照您的期望进行。

如果您检查jQuery 文档,.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 值将得到一个未定义的值,但它会适当地使您的比较失败,并且您的原始代码将实际工作。我不会推荐它,因为这是一种更安全的方法,而且性能可能也会更好一些。

于 2012-04-18T17:50:54.700 回答
0

循环第一次运行时,当this使用 class 引用 DOM 中的第一个元素时tarefa,没有带有 class 的前一个元素tarefa- 因此.prev('.tarefa')不会选择任何东西。

于 2012-04-18T17:50:45.957 回答
0

你应该可以一起使用它们。这个例子有效:

<script type="text/javascript">
    ​$(function(){
        $(".test").each(function(index){
            if (index){
                alert($(this).prev().text());
            }            
        });        
    });​
</script>
​&lt;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

于 2012-04-18T17:57:00.803 回答