将变量传递给jquery eq()函数不起作用

时间:2012-08-30 08:26:37

标签: jquery for-loop global-variables blur

对于每个tr,我希望区分一个td包含span与文本和另一个td包含input框的重点关注第二个input中的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计算工作中使用数字0替换变量var diff。但是使用i本身会返回-ve值。含义$('.samples_available span').eq(i).text()返回0.

可能是因为i是在blur()函数之外定义的并且没有全局设置,所以在blur()函数内部时不会选中它。

或者我如何使用each()函数复制它?

谢谢。

3 个答案:

答案 0 :(得分: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);

}

答案 1 :(得分:2)

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

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

答案 2 :(得分: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的建议并将差异放回事件处理程序中。