无论出于什么考虑,永远别在 JS 中拼接 HTML 字符串... but why? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
akinoniku
V2EX    程序员

无论出于什么考虑,永远别在 JS 中拼接 HTML 字符串... but why?

  •  
  •   akinoniku
    akinoniku 2013-05-24 15:02:25 +08:00 9683 次点击
    这是一个创建于 4593 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Whatever templating strategy you end up with, it's nice if you never have to put strings of HTML in your Javascript.

    出自 http://backbonejs.org/

    那是什么考虑? 是防XSS? 好维护? 还是别什么原因?
    50 条回复    1970-01-01 08:00:00 +08:00
    kingwkb
        1
    kingwkb  
       2013-05-24 15:04:19 +08:00
    最佳的做法是什么呢?
    lyric
        2
    lyric  
       2013-05-24 15:14:44 +08:00   1
    嗯,防XSS而且好维护

    @kingwkb 最佳做法当然是用模版了。

    推荐 AngularJS 的 DOM 模版。
    darasion
        3
    darasion  
       2013-05-24 16:00:28 +08:00
    感觉js做的拼接或者模板,都有点不可靠。
    alexrezit
        4
    alexrezit  
       2013-05-24 16:02:29 +08:00
    目测星祈娘快要完工了...
    ipconfiger
        5
    ipconfiger  
       2013-05-24 16:03:31 +08:00
    一般都在局部用underscore.js的模板。
    bitsmix
        6
    bitsmix  
       2013-05-24 16:05:16 +08:00
    @lyric angularjs 有独立出来的模板了额???
    ghbjy1128
        7
    ghbjy1128  
       2013-05-24 16:22:42 +08:00
    我用胡子,好用的。
    akinoniku
        8
    akinoniku  
    OP
       2013-05-24 16:23:56 +08:00
    @alexrezit 其实是考虑到对你项目的扩展-> restful -> js模板 -> 单页webapp -> backbonejs

    结论是,不知道要不要重新做一下界面?

    https://www.dropbox.com/s/m7cfpo6xggj0u8c/xqn%205.png

    (flat ui 又有阴影,检讨)
    jasya
        9
    jasya  
       2013-05-24 16:50:41 +08:00
    AngularJS 的学习成本太高了
    loading
        10
    loading  
       2013-05-24 16:58:03 +08:00
    我不知道restful是什么,有人举个简单例子说明下么…
    juicy
        11
    juicy  
       2013-05-24 17:49:32 +08:00
    。。。从backbone文档里那句话的上下问来看,这句话的作用纯粹是推荐你使用模板来拼接字串,而不要费劲自己去拼接(因为那样很繁琐,不便于维护)。

    这句话传递出来的语气应该是这样的:“甭管你最后用什么模板,只要你用模板来实现,而不是自己去吃力不讨好地拼啊拼,那我心里就舒畅了(要不我看着都纠结死了。。。)“

    什么防XSS啊,那是想太多了吧。。。
    akinoniku
        12
    akinoniku  
    OP
       2013-05-24 18:30:01 +08:00   1
    @loading
    通俗点说应该是把这个对应起来,然后服务器的/route/[id]请求,返回json
    create → POST
    read → GET
    update → PUT
    delete → DELETE

    也就是说服务器不是返回页面或者其他东西了,返回只是纯碎的数据。


    当然这个说法也不太科学。。
    lyric
        13
    lyric  
       2013-05-24 19:26:08 +08:00
    @bitsmix 没独立出来,我的意思就是直接用 angularJS 啊哈哈哈

    @akinoniku 做 WebApp 我一定要推荐 AngularJS 啊。我两个月前花了几天把一个 4k CoffeeScript 的项目从 Spine 移植到 Angular

    @jasya 不高,一下午走一遍官方教程而已。
    bitsmix
        14
    bitsmix  
       2013-05-24 20:29:14 +08:00 via iPhone
    @lyric 我也想呢。。 不可能独立出来嘛!
    我也力挺 angular 一站式解决方案啊简直就是。
    reusFork
        15
    reusFork  
       2013-05-24 20:53:31 +08:00   1
    你理解错这句话的意思了。它只是说把html放在模版文件里,比放在js里更nice而已
    模版的实现当然会涉及字符串操作,怎么可能永远不用
    hxgdzyuyi
        16
    hxgdzyuyi  
       2013-05-24 21:08:15 +08:00
    @lyric 你现在是angular粉呀。 我觉得angular太重了~
    lyric
        17
    lyric  
       2013-05-24 21:16:40 +08:00
    @hxgdzyuyi 不重啊。才80kb。可以像用jQ一样用它,也可以像用一个框架一样用它
    alexrezit
        18
    alexrezit  
       2013-05-24 21:17:47 +08:00
    @akinoniku
    其实现在还没开工咱会乱讲?
    倒是折腾了些别的东西...
    hxgdzyuyi
        19
    hxgdzyuyi  
       2013-05-24 21:36:03 +08:00
    @lyric 两个jquery那么大吧~ 重的方面觉得 它好像把很多功能都实现了,实现了一个大而全的框架~ 当然不是说不好, 只是觉得并不是很对我的胃口。 目前还是偏向于可以像积木一样用很多小库堆起来。感觉替换的空间会更大。 更灵活
    lyric
        20
    lyric  
       2013-05-24 22:31:57 +08:00
    @hxgdzyuyi jQuery 1.9 min 96kb... angularJS 80kb ...
    akinoniku
       
    akinoniku  
    OP
       2013-05-24 22:51:08 +08:00
    @lyric angularJS 是把jquery也省了的意思吗。。?
    lyric
        22
    lyric  
       2013-05-25 00:03:44 +08:00
    @akinoniku 对啊。用了Angular,99%的操作DOM的机会就没了。
    lyric
        23
    lyric  
       2013-05-25 00:05:03 +08:00
    @akinoniku 所以不需要jQuery了。
    squallsdjl
        24
    squallsdjl  
       2013-05-25 00:35:54 +08:00
    @akinoniku 好有意思的项目,我本来和一位ios开发的朋友商量做相似的东西来着~
    leohxj
        25
    leohxj  
       2013-05-25 00:52:34 +08:00 via Android
    @ghbjy1128 胡子是啥
    MarshallChen
        26
    MarshallChen  
       2013-05-25 02:41:35 +08:00
    @leohxj Mustache template
    hisea
        27
    hisea  
       2013-05-25 03:09:26 +08:00
    支持AngularJS,支持用AngularJS的时候不用JQuery
    akinoniku
        28
    akinoniku  
    OP
       2013-05-25 08:19:45 +08:00
    @lyric 好。。我跳坑


    @squallsdjl 谢谢~ 业余项目有意思是很重要的
    squallsdjl
        29
    squallsdjl  
       2013-05-25 09:16:17 +08:00
    @akinoniku 你在北京么?如果可以的话一起来玩把~http://devin.zarktui.com/talk/6,
    @alexrezit 肿么给你发这个的时候你木有反应~http://devin.zarktui.com/talk/6,不感兴趣么~哈哈
    akinoniku
        30
    akinoniku  
    OP
       2013-05-25 09:20:45 +08:00
    @squallsdjl 谢谢。。 虽然我很想去,可是我在深圳。。非常远呢
    alexrezit
        31
    alexrezit  
       2013-05-25 09:22:38 +08:00
    @squallsdjl
    大概没看到... 而且我还在哈尔滨呢!!!
    squallsdjl
        32
    squallsdjl  
       2013-05-25 09:57:35 +08:00
    @akinoniku @alexrezit 是吧那欢迎关注微信公众帐号咯~zarkxdev,
    话说alexrezit你怎么又跑回家了哈哈哈哈~
    yakczh
        33
    yakczh  
       2013-05-25 10:02:57 +08:00
    @hisea AngularJS 根据自定义标签生成动态脚本是什么原理?
    是不是根据标签分很多case

     case tagXX

    fun=new Function("xxxx")
    tag.OnXX=fun
    lyric
        34
    lyric  
       2013-05-25 10:31:48 +08:00
    @akinoniku 哈哈哈哈哈哈哈哈,我觉得我可以去当布道师
    lyric
        35
    lyric  
       2013-05-25 10:34:41 +08:00
    @yakczh 说的是用directive http://docs.angularjs.org/guide/directive 构建自定义组件么?
    hisea
        36
    hisea  
       2013-05-25 10:49:23 +08:00
    @yakczh 他们应该也是event loop,然后由很多watcher来watch那些特殊的tag
    alexrezit
        37
    alexrezit  
       2013-05-25 10:52:16 +08:00
    @squallsdjl
    在家好几个月了...
    damngood
        38
    damngood  
       2013-05-25 11:06:29 +08:00
    @hisea
    可是如果使用 BootStrap 这种框架的话, 还是免不了要引入 JQuery...

    看了下源码, 貌似 Angular 会在 JQuery 存在的情况下优先使用 JQuery 做 Dom 操作
    如果不存在的话就使用自己的一个 Mini JQuery 组件

    另: Angular 真的很好用.. :)
    yishenggudou
        39
    yishenggudou  
       2013-05-25 12:38:46 +08:00
    AngularJS 比backbone的优势在那里 感觉 AngularJS 文档看着一头雾水 backbone.js 就很清晰
    akinoniku
        40
    akinoniku  
    OP
       2013-05-25 13:47:37 +08:00
    @lyric 刚看完Tutorial,实在是太棒了。
    bitsmix
        41
    bitsmix  
       2013-05-25 14:11:01 +08:00 via iPhone
    @yishenggudou 写写就知道了
    lyric
        42
    lyric  
       2013-05-25 15:51:03 +08:00
    @damngood 没关系,有一个 jQuery free 的 Bootstrap,即现在的 angular-ui
    lyric
        43
    lyric  
       2013-05-25 15:53:56 +08:00
    @akinoniku 我成功了:)
    akinoniku
        44
    akinoniku  
    OP
       2013-05-25 16:02:22 +08:00
    @lyric 如果公司的项目可以用AngularJS重写就好了。。。
    damngood
        45
    damngood  
       2013-05-25 17:22:19 +08:00
    @lyric 当时有找过 Bootstrap port in Angular, 结果也找到了你提到的那个..
    但是考虑到当时刚开始使用 Angular, 怕驾驭不了, 于是就还是用的 Bootstrap..
    下个项目试一下看看.. :)
    chuck911
        46
    chuck911  
       2013-05-25 18:11:40 +08:00   1
    @akinoniku 少年,我想从另外一个角度说一下
    “it's nice if you never have to” 和 “永远别” 语气上差别大了点
    never have to 意思是“绝不是必须”=>不必=>可以不 , 而不是“必不”
    比如老无所依里有句台词 “You don't have to do this” ,意为“你不必这么做的”,而不是“你不许这么做!”
    再加上“it's nice if ”,真是委婉得不得了

    直译的话,“不管你用什么模板策略,如果你不是只能把html塞进js,那是很好的”
    luikore
        47
    luikore  
       2013-05-25 18:25:46 +08:00
    如果不懂为什么,永远别写代码算了...
    如果懂了,任何never都没有意义...
    hxgdzyuyi
        48
    hxgdzyuyi  
       2013-05-26 10:06:38 +08:00
    @lyric 看你前面说80kb 脑补成gzip后了。
    hxgdzyuyi
        49
    hxgdzyuyi  
       2013-05-26 10:23:50 +08:00
    @lyric 可能有些偏见了 回头写个todo list 试试~
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     912 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 18:59 PVG 02:59 LAX 10:59 JFK 13:59
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86