2010-01-23 2 views
2

Я создаю плагин, который соответствует элементу, находит ссылку внутри него и заставляет родительский элемент перемещаться в это место по клику.Связывание события click jQuery с каждым элементом в цикле foreach

У меня есть цикл в основном корпусе:

return this.each(function(options) 
{ 

    $to_link = $(this); //matched object 
    link_href = $('a', $to_link).attr('href'); //link location 
    $($to_link,$parent) 
     .click(function(){alert(link_href); window.location = link_href; return false;}) 
     .attr('title','Jump to ' + link_href); 
}) 

который я бегу это против этого HTML

<div id="a"><h2><a href="/products/">Products</a></h2><p>blah blah</p></div> 
<div id="b"><h2><a href="/thinking/">Thinking</a></h2><p>liuhads</p></div> 

У меня есть проблема в том, что функция нажмите всегда приводит в прыжках в значение последнего совпадающего элемента div, хотя заголовок элемента имеет правильное значение.

Чтобы уточнить, поведении материала должно быть:

  • ДИВ # а имеет название «Перейти к/продукции /» и при нажатии на идет к/Продукты/

  • ДИВ # а имеет титул «Перейти к/мышлению /» и при нажатии на идет к/мышлению/

вместо этого, что случается:

  • ДИВ # а имеет название «Перейти к/продукции /» и при нажатии на идет к /мышления/ (предупреждение говорит/мышления/тоже)

  • ДИВ # а имеет название «Jump to/thinking /» и при нажатии на кнопку/мышление/

ie div # a заканчивается неправильным поведением. Я предполагаю, что это какая-то проблема, но для жизни я не вижу ее, помогу!

ответ

4

Существует более полный ответ на общий случай здесь

http://www.foliotek.com/devblog/keep-variable-state-between-event-binding-and-execution/

Ответ # 2 является использование закрытия, чтобы заставить новый уровень охвата :)

+0

Вскоре после этого я узнал, как замыкания действительно работают, после чего я точно узнал, что JS действительно способен, читая Crockford! – Sqoo

+0

Таким образом, реальный ответ - это использование замыканий, создающих новую область видимости. – Sqoo

+0

ответ # 2 потрясающе! Решила мою проблему :) – Yasser

4

Вы забыли var в своих заданиях, поэтому вы делитесь одной глобальной переменной и смешиваете ее.

$to_link = $(this); //matched object 
link_href = $('a', $to_link).attr('href'); //link location 

должен быть

var $to_link = $(this); //matched object 
var link_href = $('a', $to_link).attr('href'); //link location 

В противном случае link_href сохранит последнее значение, и это значение обработчика нажмите будет видеть, когда его называют.

+0

Спасибо! Очевидный и совершенно пропустимый, когда вы увязли в вещах. – Sqoo

+0

+1 за хорошее мышление! – Reigel

+0

.... делал слишком много PHP methinks;) – Sqoo