设置变量以与jquery click函数一起使用

时间:2010-10-21 16:45:16

标签: javascript jquery closures

如果这只是另一个被一遍又一遍地问的问题,我很抱歉。我发现了一些类似的问题,这些例子并没有让我到达我需要的地方。这类似于jQuery Closures, Loops and Events

$('a.highslide').each(function() {
  hsGroup = $(this).attr("rel");

  if(hsGroup.length > 1){
     hsGroup = hsGroup.replace(/\s/g , "-");     
  }    

  this.onclick = function() {
    return hs.expand(this, { slideshowGroup: hsGroup });

  }
});

此代码设置启动高滑动弹出窗口的onclick。我已经添加了slideshowGroup属性和它上面的hsGroup代码,它们提取了Rel属性的内容来定义每个属性的组。您可能会立即看到的问题是hsGroup的内容不是该anon函数的本地内容。因此,在运行时,对于应用的每个链接,其值始终相同。我查看了一些封闭示例,但迄今为止未能使它们在我的情况下工作。

谢谢,

2 个答案:

答案 0 :(得分:5)

您只需要var为每个链接创建一个,如下所示:

$('a.highslide').each(function() {
  var hsGroup = $(this).attr("rel");
  //^ -- add this

  if(hsGroup.length > 1){
     hsGroup = hsGroup.replace(/\s/g , "-");     
  }    

  this.onclick = function() {
    return hs.expand(this, { slideshowGroup: hsGroup });

  }
});

没有 var你有一个全局hsGroup变量,它被重复用于每个循环,并以每次点击时使用的相同的最后一个值结束。

或者,只需在click事件发生时进行替换,如下所示:

$('a.highslide').click(function() {
  var hsGroup = $(this).attr("rel");
  if (hsGroup.length > 1) hsGroup = hsGroup.replace(/\s/g , "-");    
  return hs.expand(this, { slideshowGroup: hsGroup });
});

答案 1 :(得分:4)

这是因为您没有将hsGroup声明为本地,因此您遗漏了var

var hsGroup = $(this).attr("rel");

否则,hsGroup是全局的,因此设置为最后一次迭代的值。