对于每个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()
函数复制它?
谢谢。
答案 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的建议并将差异放回事件处理程序中。