0

重複の可能性:
Javascript の終了の問題

次のコードでTrueThis.aChoices[i]['CallBack']は、 はクリック イベントが作成されたときの関数であり、クリック イベントが実際に発生したときは "false" です。クリック イベント ハンドラーへの関数参照を取得するにはどうすればよいですか?

私のオブジェクト:

ATK.MultiChoiceDialog = function() {

   var TrueThis = this;
   var aChoices;

   this.Show = function(sTitle,sPrompt,aChoices){
      this.aChoices = aChoices;

      var HTML = '[snip]';
      $('body').append(HTML);

      for(var i in this.aChoices)
      {      
         console.log(TrueThis.aChoices[i]['CallBack']); // shows "function"
         $('#ATKDialogButton'+i).click(function(e){
            console.log(TrueThis.aChoices[i]['CallBack']); // shows "false" ???
            if(TrueThis.aChoices[i]['CallBack'])
            {
               TrueThis.aChoices[i]['CallBack'].call(aChoices[i]['Context']);
            }
         });      
      }
   }
};

私もこれを試しました:

for(var i in this.aChoices)
{      
   var CB = TrueThis.aChoices[i]['CallBack'];
   console.log(CB); // function
   $('#ATKDialogButton'+i).click(function(e){
      console.log(CB); // false
      if(TrueThis.aChoices[i]['CallBack'])
      {
         TrueThis.aChoices[i]['CallBack'].call(aChoices[i]['Context']);
      }
   });      
}
4

2 に答える 2

1

jQuery には、イベントにバインドされているコールバック関数にイベント データを渡すことで、これを処理する組み込みの方法があります。

ATK.MultiChoiceDialog = function() {

   var TrueThis = this;
   var aChoices;

   this.Show = function(sTitle,sPrompt,aChoices){
      this.aChoices = aChoices;

      var HTML = '[snip]';
      $('body').append(HTML);

      for(var i in this.aChoices){ // in js the '{' should be on same line
         console.log(TrueThis.aChoices[i]['CallBack']); // shows "function"
          $('#ATKDialogButton'+i).click({i:i},function(e){ // data passed in with {i:i}
            console.log(TrueThis.aChoices[e.data.i]['CallBack']); // shows "function" 
            if(TrueThis.aChoices[e.data.i]['CallBack']){ // in js the '{' should be on same line
               TrueThis.aChoices[e.data.i]['CallBack'].call(aChoices[e.data.i]['Context']);
            }
         });      
      }
   }
};​
于 2012-10-10T18:20:43.487 に答える
0

コメントのおかげで、私はこれを機能させました。まず、iの値を「修正」する新しい関数を作成します。これにより、イベントハンドラーの関数が返されます。

this.FixI = function (i){
   return function(e){
      if(TrueThis.aChoices[i]['CallBack'])
      {
         TrueThis.aChoices[i]['CallBack'].call(TrueThis.aChoices[i]['Context']);
      }
   }
}

新しい関数を使用して、ループ内に偶数ハンドラー関数を生成します。

for(var i in this.aChoices)
{
   $('#ATKDialogButton'+i).click(TrueThis.FixI(i));      
}

更新: Kevin Bは、追加の「プリサーバー」機能を必要としない問題に対処するJqueryの方法を見つけたようです。

于 2012-10-10T18:24:22.057 に答える