2012-04-18 15 views
-2

私は自分のコードにいくつかのdivを持っているので、実際のものと最後のものをチェックしてループしたいと思います。each()とprev()を一緒に使用できますか?

これはなぜ機能しないのですか?

<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")は常に不定になります。これ.prev('.tarefa')は何も選択しないだろう -

+0

だ ' '(。tarefa')'作業する.tarefa''は '$(この).prevため、互いの直接の兄弟でなければなりません'。 –

+0

マークアップを教えてください。最初の考え方... 'prev()'は 'each()'ループの以前の繰り返しを参照しません。代わりに、DOM内の '$(this)'の前に位置する要素を参照します。 –

+0

答えは**はい**です。一緒に使うことができます(どうしてそうではありませんか?)。しかし、あなたが必要とするものは、常に意味をなさないかもしれません... –

答えて

2

あなたのHTMLが含まれていれば、はるかに直接的に答えることができました。あなたのコードには2つの潜在的な問題があります。

1).each()の最初の項目を比較すると、空のjQueryオブジェクトに.css("left")を要求するので、.prev()は存在しません。それはおそらく平等テストに失敗しますが、一般的には良い考えではありませんベストまでは未定義です。

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); 
     } 
    }); 
}); 

はEDIT:

あなたのコメントに置かれているHTMLを使用すると、元のコードは、実際に動作します。 .each()を最初に通過すると、.prev()CSS値の値が未定義ですが、実際には比較が失敗し、元のコードが実際に機能します。私はこれを行うよりはるかに安全な方法であり、おそらく少しだけ良くなるので、私はそれをお勧めしません。

+0

私のコードは次のようなものです:

1
2
3
のスタイル。私はあなたの答えを得ていませんでした。 –

+0

完璧に作業しました!ありがとう! –

+0

@ErickEngelhardt:質問を編集してHTMLマークアップを含めてください。あなたが提供したマークアップを考えると、あなたのコードはうまくいくはずです。 –

0

thisはクラスtarefaとDOMの最初の要素を参照する場合ループは、初回実行時には、クラスtarefaと以前の要素はありません。

+0

なぜdownvote、私は正しくないですか?他の答えで指摘されているように、他の問題もあります。 –

+0

しかし、なぜsecund runが機能するのですか?二番目だけ。 –

+0

@ErickEngelhardt DOMがどのように見えるのかわからなくても難しいですが、理論的には最初のものが動作するはずです。 –

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

関連する問題