2012-04-18 2 views
-2

У меня есть некоторые divs в моем коде, и я хочу, чтобы они их проверяли с помощью последнего.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") всегда получают неопределенными.

+0

Параметр ' '.tarefa'' должны быть прямыми братьями и сестрами друг друга для' $ (это) .prev (' tarefa '.) 'Работать. –

+0

Покажите нам разметку. Первоначальная мысль ... 'prev()' не относится к предыдущей итерации цикла 'each()'. Вместо этого он ссылается на элемент, который находится до '$ (this)' в DOM. –

+0

Ответ: ** да **, они могут использоваться вместе (почему бы и нет?). Это может не всегда иметь смысл, хотя или не то, что вам нужно ... –

ответ

2

Если вы включили свой HTML-код, мы могли бы ответить гораздо больше напрямую. Я вижу две потенциальные проблемы с вашим кодом.

1) При сравнении первого элемента в .each() не может быть .prev(), поэтому вы запрашиваете .css("left") на пустом объекте jQuery. В лучшем случае это будет неопределенным, что, вероятно, не даст теста на равенство, но, как правило, не является хорошей идеей.

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 относится к первому элементу в DOM с классом tarefa, нет предыдущего элемента с классом tarefa - таким образом .prev('.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

Смежные вопросы