提问人:rafanoronha 提问时间:11/27/2012 最后编辑:rafanoronha 更新时间:11/28/2012 访问量:187
关于客户端不显眼的 JavaScript hack 的反馈
Feedback on client-side unobstrusive JavaScript hack
问:
我正在开发一个 SPA 应用程序,其中 Backbone.js 是体系结构的主要部分。
我们还有一些 Twitter Bootstrap 风格,其中我们有 Button 组[1]。 因此,html将这些按钮用作复选框或单选按钮。
为了透明地将Backbone模型绑定到包含这些按钮的Backbone视图,而不是使用Backbone.ModelBinder[2],我砍掉了以下代码:
# Twitter Bootstrap compatibility
addButtonGroupModelBindingSupport = ->
$(@el).one 'mousedown keydown', '.btn-group[data-toggle="buttons-radio"] button', ->
$(@).closest('.btn-group').find('button').prop 'type', 'radio'
installTwitterBootstrapModelBindingSupport = ->
backboneView = Backbone.View
ButtonGroupModelBinderSupportView = Backbone.View.extend
constructor: ->
backboneView.apply @, arguments
addButtonGroupModelBindingSupport.call @
return
Backbone.View = ButtonGroupModelBinderSupportView
installTwitterBootstrapModelBindingSupport()
此代码是导出 ModelBinder 的模块的内部代码,因此它只执行一次。 我在 Backbone.View 中混合了我需要的行为,以便以一种不显眼的方式注入似是而非的 JavaScript。
所以我告诉那些按钮,它们不再是按钮了。 据我所知,Chrome、Firefox 和 IE 对此没问题。
被愚弄了,ModelBinder 正确地将这些按钮作为复选框或单选按钮处理,一切都可以根据需要工作。
如果这个黑客看起来太棘手了,那么很高兴听到更有经验的前端开发人员的意见。
[1] http://twitter.github.com/bootstrap/components.html#buttonGroups
答:
如果它在所有目标浏览器/平台上都适合您,我不能说这是错误的,但这肯定是不寻常的。我认为这种方法有一些缺点:
- 它不是标准的 HTML。对按钮有效,为 和 。请参阅此处的规格
types
submit
reset
button
- 由于这种情况并不常见,因此可能会误导团队中的其他开发人员(假设您不是独自工作)。
- 即使它适用于这种特殊情况,下次您需要使用不同的插件/组件时,您可能不会那么幸运地找到像这样工作的黑客。
- 在您的情况下,这可能不是问题,但选择器(例如)不会找到您被黑的按钮
$('input').something()
AFAIK,处理这种情况的常用方法(您需要输入元素,但希望在视图中拥有更漂亮的 UI 元素)是让两个元素在页面中同步 - 漂亮的样式 div 和实际输入(不可见)。以下是一些示例:Select2、Fancy Checkboxes 和 Radio Buttons。由于它更常见,这可能是解决您的问题的更好方法,即使它需要编写更多的 js。
评论