ループで呼び出すこともできますtoggle
が、奇妙なJSスコープルールに注意する必要があります。基本的に、ループ内で次のような関数を生成する場合:
for n in [1, 2, 3]
$(".btn-#{n}").click -> alert "you clicked #{n}"
を押すと、すべてのボタンに「3をクリックしました」と表示されます。これは、n
変数のスコープがループの本体に限定されているのではなく、そのループを含むすべての関数に限定されているためです。したがって、ループが実行されると、の値n
が変更され、最終的な値は3になります。ループ内で作成されたすべての関数は同じ変数への参照を持っているためn
、ループの終了後に実行すると、すべて3が出力されます。CoffeeScriptでは、を使用してこの問題を回避できます。これによりdo statement
、基本的に新しいブロックスコープ変数が導入されます。
for n in [1, 2, 3]
do (n) ->
$(".btn-#{n}").click -> alert "you clicked #{n}"
または補助機能を使用する:
setupClick = (n) ->
$(".btn-#{n}").click -> alert "you clicked #{n}"
setupClick n for n in [1, 2, 3]
それを念頭に置いて、あなたはそのようにあなたのループを実装することができます(これはリカルドの答えの適応です):
$content = $('#primary-content')
$container = $content.find('.container')
targetsByTrigger =
'.sales-focus-btn': '.sales-focus'
'.service-focus-btn': '.service-focus'
'.other-focus-btn': '.other-focus'
setupTrigger = (trigger, target) ->
$(trigger).toggle ->
$container.hide()
$content.find(target).show()
console.log 'showing', target
, ->
$container.show()
setupTrigger trigger, target for trigger, target of targetsByTrigger
トリガーとターゲットの両方のクラス名をオブジェクトに配置して、トリガークラス名を<target class name>-btn
;から取得できることに注意してください。そうでない場合は、のような配列に固執してから['.sales-focus', '.service-focus', '.other-docus']
追加する-btn
方がおそらく良いでしょう。また、$
「jQuerized」値のプレフィックスとして使用する規則が好きですが、それは個人的な好みです:)