2012-08-30 30 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