2010-01-23 78 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

相关问题