2

对于每一个我想通过下面的脚本tr来区分一个td包含span文本和另一个td包含一个inputinput的区别:td

$(function() {
    var tr_no = $('.unitrows').length;
    for (i = 0; i < tr_no; i++) {
        $('.samples2issue input').eq(i).blur(function() {
            var diff = $('.samples_available span').eq(i).text() - $(this).val();
            alert(diff);
        })
    }
})​

问题是在计算中用i数字替换变量。但是使用本身返回一个-ve值。含义返回 0。0var diffi$('.samples_available span').eq(i).text()

可能是因为i在函数外部定义blur()并且没有全局设置它在blur()函数内部时没有被选中。

或者我如何能够使用该each()功能复制它?

谢谢你。

4

3 回答 3

4

问题是事件处理程序中的代码在i循环完成后使用变量,因此它将比最后一个元素的索引多一个。

使用闭包在每次迭代中捕获变量的值:

for (var i = 0; i < tr_no; i++) {

  (function(i){

    $('.samples2issue input').eq(i).blur(function(){
      var diff = $('.samples_available span').eq(i).text() - $(this).val();
      alert(diff);
    });

  })(i);

}
于 2012-08-30T08:30:46.113 回答
2

您可以在循环i之前简单地在全局范围内定义:for

var i = 0;
for(; i<tr_no; i++){
    ...
}
于 2012-08-30T08:30:21.333 回答
1

我没有看到 html,但更清晰的 jquery 将是这个。

$('.unitrows').each(function(i){
  $('.samples2issue input').eq(i).blur(function(){
     var diff = $('.samples_available span').eq(i).text() - $(this).val();
     alert(diff);
  });
});

编辑:我按照 Guffa 的建议将差异放回事件处理程序中。

于 2012-08-30T08:33:47.580 回答