1

私はメッセージのマップを持っています:

var Mapping = {
"notnow": 2,
"expensive": 3,
"not_worth_it": 4
}

私はたくさんのhtml要素を持っています(同じ名前のdivとしましょう)

<div id="notnow"></div>

、等

次に、それぞれにクリック ハンドラーをアタッチしたいので、以下に示すようにループを実行します。

function setThemUp(){
   for(var item in Mapping)
   {
      $("#" + item).bind('click', function () {
      Apply(Mapping[item]); });
   }
}

しかし、何らかの理由で、それらすべてが「not_worth_it」にバインドされているようです:4. それぞれの値ではありません。

Jquery 1.5 を使用しています。

誰かがなぜこれが起こっているのか説明できますか?

私の推測では、Mapping[item] が値に解決されるのではなく、参照などとして渡されていると思います。そのため、 item の値は最終的に「価値がない」ことを指すため、すべてがその値で関数を呼び出します自体。私がそれらを克服できる方法。

それぞれを次のようにハードコーディングします

  $("#notnow").bind('click', function () {
      Apply(Mapping["notnow"]); });
  $("#expensive").bind('click', function () {
      Apply(Mapping["expensive"]); });
  $("#not_worth_it").bind('click', function () {
      Apply(Mapping["not_worth_it"]); });

動作しますが、ループを使用したエレガントなソリューションをお勧めします。

答え

私は閉鎖ソリューションに行きました

function setThemUp(){
   for(var item in Mapping)
   {
       $("#" + item).bind('click', (function () {
            return function(temp) {
                 Apply(Mapping[temp]); };
            })(item));
       }
   }

理由は、これは jquery の最適化ではなく、ループが機能しなかった理由でした.

4

3 に答える 3

4

これは、スコープitemの問題の典型的なケースです。バインドされた各ハンドラーで変数を参照しています。ただし、変数itemは変更されます->オブジェクトリテラルのすべてのプロパティが割り当てられMapping、最後のプロパティはnot_worth_it.

item各コールバックの状態を保持するには、クロージャーを作成すると役立つ場合があります。

for(var item in Mapping)
{
   $("#" + item).bind('click', (function(currentItem)
   {//IIFE, pass item as argument---------/
        return function ()
        {//return function, \/ access to closure scope
            Apply(Mapping[currentItem]);
         };
    }(item)););
}

しかし、これはやややり過ぎのようです。単純にイベントをデリゲートして、 を使用しないのはなぜMapping[$(this).attr('id')]ですか?

于 2012-11-16T18:13:53.403 に答える
0

このフォームに移動することをお勧めします。

mappedクラスをマッピング div に追加します。

HTML

<div id="notnow" class="mapped"></div>

JS

function setThemUp(){
    $('.mapped').bind('click', function () {
        Apply(Mapping[this.id]); 
    });
}
于 2012-11-16T18:26:52.510 に答える
-1

問題は、次のように記述する必要があることです。

for (var item in Mapping) 

foreachではなく。

于 2012-11-16T18:12:57.637 に答える