[英]How to organize coffescript in better way
我有以下代码:
hideOther = ->
$('[class^=addition_translation]').hide()
$('.en_addition').click ->
hideOther()
$('.addition_translation_en').show()
$('.pl_addition').click ->
hideOther()
$('.addition_translation_pl').show()
$('.de_addition').click ->
hideOther()
$('.addition_translation_de').show()
$('.fr_addition').click ->
hideOther()
$('.addition_translation_fr').show()
$('.it_addition').click ->
hideOther()
$('.addition_translation_it').show()
$('.ua_addition').click ->
hideOther()
$('.addition_translation_ua').show()
$('.ru_addition').click ->
hideOther()
$('.addition_translation_ru').show()
没有这种不必要的重复,编写此代码的最佳方法是哪种?
编辑:
countries = ["pl", "en"]
for country in countries
$(".#{country}_addition").click ->
hideOther()
$(".addition_translation_#{country}").show()
我这样做,也许是更好的方法?
使用正确的缩进(因为在CoffeeScript中缩进很重要),就可以了:
countries = ["pl", "en"]
for country in countries
$(".#{country}_addition").click ->
hideOther()
$(".addition_translation_#{country}").show()
它确实为每个.XX_addition
元素设置了一个单独的函数,但是除非有成千上万个元素或它们被动态添加,否则应该没问题。
另一个选择是事件委托,它具有一个处理所有这些元素的功能。 当列表是动态的时,这(再次)特别方便。
假设所有这些.addition_translation_XX
元素都在某个容器中(我称其为.container
):
$(".container").on "click", "[class$=_addition]", ->
country = this.className.substring 0, 2
$("[class^=addition_translation]").hide()
$(".addition_translation_#{country}").show()
我们在这里说的是:钩住容器,但是只有在它通过匹配"[class$=_addition]"
的元素(其类属性以 _addition
结尾的元素)时,才调用我们的处理程序。 jQuery将调用我们的处理程序与this
指的是元素,所以我们得到了国家从className
,隐藏其他国家,并表明一个。
请注意,就像您的"[class^=addition_translation]"
选择器假定XX_addition_translation
类是这些元素的类列表中唯一的(或至少最后一个)类一样,以上假定XX_addition
是唯一的(或至少第一个)类。在这些元素的类列表中。 在这两种情况下,我都不会做出这样的假设,因为它是脆弱的。 相反,我将使用一个类来标记没有国家/地区信息的元素(因此,只需添加.addition
和.addition_translation
,然后向其添加data-country
属性即可:
<span class="addition" data-country="ru">...</span>
<div class="addition_translation" data-country="ru">...</div>
然后:
$(".container").on "click", ".addition", ->
country = this.getAttribute "data-country"
$(".addition_translation").hide()
$(".addition_translation[data-country=#{country}]").show()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.