你可以toggle
循环调用,但你必须注意奇怪的 JS 范围规则。基本上,如果您在循环中生成一个函数,如下所示:
for n in [1, 2, 3]
$(".btn-#{n}").click -> alert "you clicked #{n}"
您会注意到所有按钮在按下时都会打印“you clicked 3”。这是因为n
变量的作用域不仅限于循环体,还包括包含该循环的所有函数。因此,当循环运行时,它的值n
被改变,它的最终值是 3。由于循环内创建的所有函数都引用了同一个变量n
,所以在循环完成后执行时它们都将打印 3。在 CoffeeScript 中,你可以使用 a 来规避这个问题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]
考虑到这一点,您可以像这样实现循环(这是对Ricardo 答案的改编):
$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”值作为前缀的约定,但这只是个人喜好:)