2

リストが作成された後、「.each」を使用してすべてを調べ、クリック手順を適用しようとしています。

このような私のコードは正常に動作します:

$.ajax({
    url: "./views/todoitems.view.php",
    data: "cmd=list",
    success: function(html){
        $('#list-container').empty().append(html);
        $('input:checkbox').each(function(){
            $check = $(this);
            $check.click(function(){
                alert($(this).attr('itemid'));
            });
        });
    }
});

ただし、アラートを変更するとすぐに

alert($check.attr('itemid'));

どの項目がクリックされても、リストの最後の項目の ID のみが表示されます。私は何を間違っていますか?

4

2 に答える 2

4

$ checkは各ハンドラー内に設定され、グローバル変数です。つまり、最後のチェックボックスである最後の値セットが保持されます。正しく行うには、クリックハンドラー内に設定する必要があります。次のように変更します。

$.ajax({
  url: "./views/todoitems.view.php",
  data: "cmd=list",
  success: function(html) {
    $('#list-container').empty().append(html);
    $('input:checkbox').each(function(){
      $check.click(function() {
        var $check = $(this);
        alert($check.attr('itemid'));
      });
    });
  }
});

注: varスコープを制御するために上記で使用されます。

また、これに使用する必要はありませんeach()。これは同等です:

$.ajax({
  url: "./views/todoitems.view.php",
  data: "cmd=list",
  success: function(html) {
    $('#list-container').empty().append(html);
    $('input:checkbox').click(function() {
      alert($(this).attr('itemid'));
    });
  }
});
于 2009-07-26T15:56:46.780 に答える
2

cletusの答えに追加するには(まだコメントできません)$ checkは、宣言にvarがないため、暗黙のグローバル変数になりつつあります。

于 2009-07-26T16:01:59.030 に答える