0

このコード(私が開発しているJQueryプラグインの一部)を考慮してください:

for (var counter = 1; counter <= 3; counter++) {
    var btn = $("<a></a>").addClass(class1)
                          .addClass(class2 + counter);
    btn.click(function() {
        $.fn.myPlugin.Click(counter);
    });
    myDiv.append(btn);
 }

CSS クラス (ボタンのように見せるため) と、(1,2,3) をパラメーターとしてプラグイン関数の 1 つを呼び出すクリック イベントが含まれbtnているタグはどこにあり、作成した 3 つのボタンが含まれています。<a>countermyDiv<div>

問題は、<a>作成したすべてのタグが4パラメーターとして関数を呼び出すことであり、その理由がわかりません。

4

3 に答える 3

1

クロージャーを作成するためのより良い方法があるかもしれませんが、これは私がこのような問題に遭遇したときにやるようになったことです.

for (var counter = 1; counter <= 3; counter++) {
    var btn = $("<a></a>").addClass(class1)
                          .addClass(class2 + counter);

    (function(b,c) {
        b.click(function() {
            $.fn.myPlugin.Click(c);
        });
    })(btn,counter);

    myDiv.append(btn);
 }

btnとにかく参照によって渡されるため、渡す必要はおそらくありません。

于 2012-08-10T15:55:40.490 に答える
0

以下は、ループ内でクロージャを処理する方法の例です。これが機能する理由はi、現在の値をログに記録する関数を作成するために評価する必要があります。同様の方法で for ループに独自の makeClickHandlerFunction を作成できます。

var funcs = [];
for(var i = 0; i < 5; i++){
   var createFunc = function(x){
      return function(){console.log(x)};
   };
   funcs.push(createFunc(i));
}
funcs[0](); //logs 0
funcs[1](); //logs 1
于 2012-08-10T15:59:20.467 に答える
0

これを使用してこの問題を解決できることがわかりました

btn.click({ arg: counter }, function(event) {
    $.fn.myPlugin.Click(event.data.arg);
});
于 2012-08-10T17:07:20.470 に答える