1

JS関数を作成しましたが、配列内の値に応じて生成されるボタンをバインドする必要があります。しかし、それは私に最後の価値を与えます。クロージャを使用する必要があることを読みましたが、それでも正しくバインドできません。私はまだ閉鎖について読んだ初心者です、私はアイデアを得ましたが、それでも私が欠けているものを知りませんでした

function addNewServices(newServicesArray){
    var j=0; var x;
    for (i in newServicesArray){
        var html='';

        html='<div style="width: 33%; float: leftt"><a href="#" data-role="button" data-icon="home" id="btn-'+newServicesArray[j].servicename+'" value="'+newServicesArray[j].servicename+'" class="ui-btn-up-c">'+newServicesArray[j].servicename+'</a></div>';
        $("#main-menu").append(html);


        $('#btn-'+newServicesArray[j].servicename).bind('click', function (){bindThis(j)});
        j++;
    }

    var bindThis = function( j ) {
        return function() {
            alert(j); // gives 2 always
            alert( newServicesArray[j].servicename ); 
        };
    };
}
4

3 に答える 3

1

あなたが持っているので

function (){bindThis(j)}

j の値が 2 のときに後で呼び出されます。

あなただけが必要です

bindThis(j)

異なる値で呼び出されます

于 2013-02-20T09:13:55.347 に答える
1

ループ内でクリックをバインドする必要はありません...$(this)関数内でクリックされた参照を取得できます..

できるだけシンプルに..

function addNewServices(newServicesArray){
   var j=0; 
   for (i in newServicesArray){
      var html='';

      html='<div style="width: 33%; float: left"><a href="#" data-role="button" data-icon="home" id="btn-'+newServicesArray[j].servicename+'" value="'+newServicesArray[j].servicename+'" class="ui-btn-up-c">'+newServicesArray[j].servicename+'</a></div>';

      $("#main-menu").append(html);


   }
}

$(function(){
  $(document).on('click','a[id^="btn-"]',function (){
      var $this = $(this);
      alert($this.attr('value')); 
  });
});
于 2013-02-20T09:16:30.423 に答える
1

クロージャーは、関数が外側のスコープから変数にアクセスする方法です。ここでのキーワードは変数です。変数は変更される可能性があり、後で (クリックして) アクセスすると、新しいバージョンにアクセスできます。

とにかく、ボタンとの関連j付けを保存する必要があります。jjQuery のおかげで、bindメソッドにはすでにこのための機能があります。その2 番目のパラメーターeventData、イベント ハンドラー関数に渡されるユーザー データです。

したがって、これを次のように変更します。

(..).bind('click',function (){bindThis(j)});

これに:

(..).bind('click', j, bindThis);

...動作する必要があります*。ラッパー関数を作成する必要がないことに注意してください。bindThis関数自体を単に に渡し、呼び出すときに関数がそれに渡されることbindを伝えます。bindj

(*) — まだテストされていません

于 2013-02-20T09:20:47.430 に答える