2012-08-30 82 views
2

tr我想包含在第二td与脚本集中了inputinput箱一个td含文字span和另一td之间的区别下面:传递变量jQuery的EQ()函数不工作

$(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与一些在var diff计算说0使用本身i返回-ve值works.But。含义$('.samples_available span').eq(i).text()返回0

难道因为iblur()功能之外定义,它没有设置全局它未被拾取当blur()函数内。

或者我将如何使用each()函数复制这个功能?

谢谢。

+0

你可以添加html吗? – m7o

回答

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); 

} 
+0

这个作品谢谢你!使用封闭对我来说是新的想法..但辉煌。谢啦。 – watkib

2

可以在全球范围内前for循环简单地定义i

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

这并没有什么不同,因为这个变量已经是全局的了,并且它没有帮助,因为当它被用在事件处理程序中时,变量的值不会与事件处理程序绑定时的值相同。 – Guffa

+0

@Guffa真的,试过了,正如你所说的值没有传递到'blur()'事件中的'i'变量 – watkib

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的建议,并把差异放回事件处理程序。

+0

您会希望获取事件处理程序中的文本和值,否则您将在事件绑定时获取该值,而不是在输入已更改时获取该值。由于'each'方法的回调会为索引变量创建一个闭包,所以在事件处理程序中使用它是没问题的。 – Guffa

+0

这也适用!谢谢。 – watkib