2011-02-07 3 views
0

私が書いているプラ​​グインは、内部アプリの右クリックのコンテキストメニューです。なぜこれが起こっているのかわかりません。ここでjQueryプラグインのアクションは常に最後のオプションですか?

は私のテストコードです:

$('.item').rightClickMenu([ 
{ 
    icon:'http://cdn1.iconfinder.com/data/icons/silk2/exclamation.png', 
    title:'Alert', 
    action:function(){ 
    alert('Here is an example alert!'); 
    } 
}, 
{ 
    icon:'http://cdn1.iconfinder.com/data/icons/silk2/error.png', 
    title:'Console.Log', 
    action:function(){ 
    console.log('Here is an example console.log()!'); 
    } 
} 
]); 

関連するjQueryプラグインのコードは次のとおりです。

for(x in items){ 
      $list.append('<li class="rightClickMenuOption'+x+'"><img src="'+items[x].icon+'">'+items[x].title+'</li>') 
      .find('.rightClickMenuOption'+x) 
       .bind('click',function(){ 
       items[x].action(); 
       }); 
     } 

デモ: http://jsbin.com/uxali4/3/

答えて

4

これは、それを修正します:http://jsbin.com/uxali4/4/edit

あなたはクロージャを作成しています。 for..inループに呼び出されたすべてのメソッドは、同じ親のコンテキストを内部[[Scope]]プロパティにコピーします。アクティブ化オブジェクト。したがって、すべてのメソッドは同じ変数xにアクセスします。これを修正するには別の関数を呼び出す必要があります。

for(x in items){ 
     (function(index) { 
     $list.append('<li class="rightClickMenuOption'+index+'"><img src="'+items[index].icon+'">'+items[index].title+'</li>') 
      .find('.rightClickMenuOption'+index) 
      .bind('click',function(){ 
       items[index].action(); 
      }); 
     }(x)); 
} 

更新

代わりに `のための通常の` for`ループを使用してくださいかなりimpressivly forfor..in

+0

間の速度差を示すべきhttp://jsperf.com/for-in-vs-for

を見てください... in'です。 'items'は配列です。しかし、とにかく+1: –

+0

驚くばかり!あなたは揺れる。 StackOverflowが私に許してくれたとき、約3分で答えが受け入れられます:) –

+0

@Felix、私はそれを使っていないことについてよく聞きましたが、なぜまだ理解していません。あなたはなぜあなたがすべきではないかを説明する何かを教えてください。私は知りたい、ちょうど何かを見つけることができないようです:\ –

関連する問題