3

多くの関数を作成するループを作成して、ユーザーが親指ボタンをクリックすると正しい .php ドキュメントが実行されるようにしようとしています。ループを削除してvar iaに特定の番号を指定するとうまく機能しますが、ループにしようとするとすぐに、アラート(i)で最初のループで10になります。

 var i=1;
 while ( ++i < 10 ) {
    $('#thumbup' + i).click(function() {
        var userid = $('#theuser' + i).text();
        var url = "_thumbup.php?userid=" + userid;
        //alert(url);

        $('#thumbup' + i).hide();
        $('#thumbdown' + i).hide();

        $("#toggle").css("display","block");
        alert(i); // Give me 10 on first loop?!?

        // get the URL
        http = new XMLHttpRequest(); 
        http.open("GET", url, true);
        http.send(null);

        // prevent form from submitting
        return false;   

    }); 
  }
4

2 に答える 2

9

これは古典的な問題です: コールバックが呼び出されるiまでに、ループの終わりの値があります。

これを修正する方法は次のとおりです。

var i=1;
while ( ++i < 10 ) {
   (function(i){
      // your current code
   })(i);
}

内部関数が呼び出されたときにスコープを作成し、このスコープに必要な値が含まれているため、機能しますi

于 2013-10-11T12:49:31.963 に答える
2

i の値をコールバックに渡す必要があります。これを試して:

var i=1;
 while ( ++i < 10 ) {
    (function(i){
      $('#thumbup' + i).click(function() {
        var userid = $('#theuser' + i).text();
        var url = "_thumbup.php?userid=" + userid;
        //alert(url);

        $('#thumbup' + i).hide();
        $('#thumbdown' + i).hide();

        $("#toggle").css("display","block");
        alert(i); // Give me 10 on first loop?!?

        // get the URL
        http = new XMLHttpRequest(); 
        http.open("GET", url, true);
        http.send(null);

        // prevent form from submitting
        return false;   

      }); 
    })(i);
  }
于 2013-10-11T12:52:37.407 に答える