2

以下のスクリプトを使用して、テキスト付きのテキストを含むものと、2番目のテキストからフォーカスアウトするためのボックスを含むtrものの違いを確認したいと思います。tdspantdinputinputtd

$(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ため、最後の要素のインデックスより1つ多くなることです。

クロージャを使用して、各反復で変数の値を取得します。

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 に答える