2010-01-23 110 views
2

我正在構建一個匹配元素的插件,在它內部找到一個鏈接並使父元素在點擊後進入該位置。將一個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鏈接的值。

爲了澄清,品行應該是:

  • DIV#一個有一個標題爲 「跳轉到/產品/」,當點擊進入/產品/

  • DIV#一個具有的標題是「跳轉到/思想/」,並在點擊後進入/思維/

相反,發生的事情是:

  • DIV#一個有一個標題爲「跳轉到/產品/」,當點擊進入/思/(警報說/思/太)

  • DIV#一個有標題「跳到/思考/」,當點擊去思考/

即div#a結束了錯誤的行爲。我猜這是一些範圍問題,但對我來說,我看不到它,幫助!

回答

4

有一個更全面的答案一般情況下這裏

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

答案#2是使用封閉強制的範圍:)

+0

在此之後不久,我學習了閉包的真正工作方式,之後我學到了真正的東西JS真的可以通過閱讀Crockford! – Sqoo 2012-05-06 20:05:14

+0

所以真正的答案是使用閉包來強制新的範圍。 – Sqoo 2012-05-06 20:06:06

+0

答案#2太棒了!解決了我的問題:) – Yasser 2012-10-04 06:27:21

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 2010-01-23 15:00:39

+0

+1好想法! – Reigel 2010-01-23 15:01:27

+0

....一直在做太多的PHP methinks;) – Sqoo 2010-01-23 15:01:52

相關問題