如何在JavaScript中对事件处理程序进行早期绑定? (以jQuery为例)

JavaScript的后期绑定很棒。但是,当我想要时,我如何早期绑定? 我正在使用jQuery将循环中的事件处理程序链接添加到div。变量'aTag'在循环中发生变化。当我稍后点击链接时,所有链接都会提醒相同的消息,这是'aTag'的最后一个值。如何将不同的警报消息绑定到所有链接? 所有链接都应该警告添加事件处理程序时'aTag'的值,而不是单击它时的值。
for (aTag in tagList) {
  if (tagList.hasOwnProperty(aTag)) {
    nextTag = $('<a href="#"></a>');
    nextTag.text(aTag);
    nextTag.click(function() { alert(aTag); });
    $('#mydiv').append(nextTag);
    $('#mydiv').append(' ');
  }
}
    
已邀请:
您可以将数据传递给
bind
方法:
nextTag.bind('click', {aTag: aTag}, function(event) {
    alert(event.data.aTag);
});
这将复制
aTag
,因此每个事件处理程序将具有不同的值。您的用例正是此参数为
bind
的原因。 完整代码:
for (aTag in tagList) {
  if (tagList.hasOwnProperty(aTag)) {
    nextTag = $('<a href="#"></a>');
    nextTag.text(aTag);
    nextTag.bind('click', {aTag: aTag}, function(event) {
      alert(event.data.aTag);
    });
    $('#mydiv').append(nextTag);
    $('#mydiv').append(' ');
  }
}
    
您还可以创建一个包装函数,使文本作为参数发出警报,并返回事件处理程序
function makeAlertHandler(txt) {
  return function() { alert(txt); }
}
并替换
nextTag.click(function() { alert(aTag); });   
nextTag.click(makeAlertHandler(aTag));
    
您需要保留此变量的副本,如下所示:
for (aTag in tagList) {
  if (tagList.hasOwnProperty(aTag)) {
    nextTag = $('<a href="#"></a>');
    nextTag.text(aTag);
    var laTag = aTag;
    nextTag.click(function() { alert(laTag); });
    $('#mydiv').append(nextTag);
    $('#mydiv').append(' ');
  }
}
每次循环时
aTag
变量都会改变,在循环结束时它将作为循环中的最后一项保留。但是,您创建的每个函数都指向同一个变量。相反,你想要一个变量per,所以制作一个像我上面的本地副本。 你也可以通过链接缩短这一点,但我觉得它在这种情况下是重点,因为问题是范围和参考。     

要回复问题请先登录注册