关于客户端不显眼的 JavaScript hack 的反馈

Feedback on client-side unobstrusive JavaScript hack

提问人:rafanoronha 提问时间:11/27/2012 最后编辑:rafanoronha 更新时间:11/28/2012 访问量:187

问:

我正在开发一个 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

[2] https://github.com/theironcook/Backbone.ModelBinder

javascript dom backbone.js unobtrusive-javascript

评论

1赞 JayC 11/28/2012
我这么说有点虚伪(虚伪是因为我不访问 stackoverflow 网站,我会说我想说或应该说的那么多),但这在 codereview.stackexchange.com 上可能会更好

答:

1赞 Felipe Castro 11/28/2012 #1

如果它在所有目标浏览器/平台上都适合您,我不能说这是错误的,但这肯定是不寻常的。我认为这种方法有一些缺点:

  • 它不是标准的 HTML。对按钮有效,为 和 。请参阅此处的规格typessubmitresetbutton
  • 由于这种情况并不常见,因此可能会误导团队中的其他开发人员(假设您不是独自工作)。
  • 即使它适用于这种特殊情况,下次您需要使用不同的插件/组件时,您可能不会那么幸运地找到像这样工作的黑客。
  • 在您的情况下,这可能不是问题,但选择器(例如)不会找到您被黑的按钮$('input').something()

AFAIK,处理这种情况的常用方法(您需要输入元素,但希望在视图中拥有更漂亮的 UI 元素)是让两个元素在页面中同步 - 漂亮的样式 div 和实际输入(不可见)。以下是一些示例:Select2Fancy Checkboxes 和 Radio Buttons。由于它更常见,这可能是解决您的问题的更好方法,即使它需要编写更多的 js。

评论

0赞 rafanoronha 11/28/2012
非标准类型的黑客是让我想到它的原因。
0赞 rafanoronha 11/28/2012
其他缺点闻起来并不那么难闻。很高兴了解您建议的方法,我会牢记在心。