将jQuery单击事件绑定到foreach循环中的每个元素

时间:2010-01-23 14:52:40

标签: jquery binding events click

我正在构建一个与元素匹配的插件,在其中找到一个链接并使父元素在单击时转到该位置。

我在主体中有一个循环:

    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>

我遇到的问题是,click函数总是会跳转到最后一个匹配div的链接的值,尽管该元素的标题具有正确的值。

澄清一下,行为应该是:

  • div#a的标题为“Jump to / products /”,点击后转至/ products /

  • div#a的标题为“Jump to / thinking /”,点击后转到/ thinking /

相反,会发生什么:

  • div#a的标题为“Jump to / products /”,点击后会转到 / thinking / (警告说/ think / too)

    < / LI>
  • div#a的标题为“Jump to / thinking /”,点击后转到/ thinking /

即div#a以错误的行为结束。我猜这是一个范围问题,但对于我的生活,我看不到它,帮助!

2 个答案:

答案 0 :(得分: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将保留最后一个值,这是click处理程序在调用时将看到的值。

答案 1 :(得分:4)

这里的一般情况有一个更全面的答案

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

回答#2是使用闭包来强制新的范围:)