-2

コードにいくつかのdivがあり、実際のdivを最後の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を含めていれば、もっと直接答えることができたはずです。コードに2つの潜在的な問題があります。

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

それらを一緒に使用できるはずです。この例は機能します:

<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 に答える
0

ループが最初に実行されるときthis、クラスを持つDOMの最初の要素を参照するとき、クラスtarefaを持つ前の要素はありませんtarefa-したがって、.prev('.tarefa')何も選択されません。

于 2012-04-18T17:50:45.957 に答える