2011-12-19 4 views
1

ダイナミックアコーディオンを作成しようとしています。私の問題は、forループ内のi変数への参照を取得できないようです。私はそれが範囲の問題であることを知っていますが、私はこの閉鎖がトリックを行うだろうと思っていました....誰かがこれが私を完全に狂気にさせてくれているので、助けてください。クロージャを使用してforループ内でクリック機能を動的に追加します

jQuery(function(){ 

    var tables = jQuery('table'); 
    var tableHeadings = jQuery('h3'); 

    for(i =0 , ii = tableHeadings.length; i < ii; i++){ 
    (function(){ 

     var index = i; 
     tables.eq(index).addClass('table-' + index); 

     tableHeadings.eq(index).click(function(){ 
      tables.eq(index).slideToggle(); 
     }); 

     })(); 
    } 
}); 
+0

は、あなたが、これは失敗した場所の実際の例を持っていますか?これはAFAIKを動作させるはずです。 – Matt

+0

ここでクロージャーが必要なのはなぜですか? forループ内のコードを直接実行するだけです。 – asawyer

+0

@asawyer:そうでなければクリックハンドラでは、 'i'(または' index')が常に最後の値になるためです。 – Matt

答えて

4

いっそのこと:

tableHeadings.each(function(index, element) { 
    tables.eq(index).addClass('table-' + index); 

    tableHeadings.eq(index).click(function() { 
    tables.eq(index).slideToggle(); 
    }); 
}); 
+0

' tableHeadings.eq(index) 'または' $(this) ' –

+0

良い点です。私はボディをコピー貼り付けただけですが、あなたは正しいのです。これは 'tables'と' tableHeadings'を関連付ける必要があるため、それほど単純ではありません。おそらくDOMをリファクタリングしてそれらをまとめ、おそらくDIVでラップし、ラッパーをセレクタとループvarとして代わりに使用します。 – wrschneider

関連する問題