用预置模板降低JS代码与HTML结构的耦合
最近在做一个多文件上传的东东,于是研究了下Flickr的图片上传,发现一段有意思的代码:

上面这段代码是隐藏的,添加文件时,在JS中可以当作模板来用:
var tmplItem = Dom.get('tmpl-upload-item');
var html = tmplItem.innerHTML.replace('%filename', file.name);
html = html.replace('%filesize', getFileSize(file.size));
var newItem = document.createElement('li');
newItem.id = file.id;
newItem.innerHTML = html;
uploadList.appendChild(newItem);
上面的代码,仅需知道%filename和%filesize,对具体的HTML结构是完全未知的。
按照传统的处理方式,可能得这么写:
var newItem = document.createElement('li');
newItem.id = file.id;
var nameEl = document.createElement('div');
nameEl.appendChild(document.createTextNode(file.name));
Dom.addClass(nameEl, 'name');
newItem.appendChild(nameEl);
var sizeEl = document.createElement('div');
...
newItem.appendChild(sizeEl);
uploadList.appendChild(newItem);
与传统的处理方式相比,预置模板好处很明显:JS代码不需要知道具体的HTML结构,耦合性更低。当不涉及功能性的界面改变,仅需改变预置模板的HTML结构和相应的样式即可。

March 17th, 2009 on 21:06
这样的应用在淘宝里有不少。
有时候是通过 cloneNode(true) 方法得到一个Node,然后对其操作。
有时候是利用 YUI 中的 substitute 方法,对预置html模板里的 {var} 进行替换。
March 17th, 2009 on 21:13
看完后就顶一下~~但是会不会因此导致CSS加载不正常时会显示出这些隐藏部分~~这样就不太好了~~
March 17th, 2009 on 21:25
john resig 写过一种bt的实现方法 模板里支持语句的解析
<div id=”" class=”">
<img class=”righted” src=”"/>
<a href=”/”>:
http://ejohn.org/blog/javascript-micro-templating/
March 17th, 2009 on 21:28
代码被屏蔽了 这个方法也解决了@Rainoxu的疑问
March 17th, 2009 on 21:36
关于解耦话题在变成世界真是无处不在,javascriptMVC 类库“传说”也有些很棒的解耦技巧……(前端爱好者,只为在你这里灌点水,哈哈)
March 18th, 2009 on 9:27
比较流行的应该是TrimPath,john那个很cool,但是不适合用到产品中。
May 11th, 2009 on 14:12
起初用替换,现在习惯用clone
December 5th, 2009 on 22:18
长见识了!
leave a reply