我正在调用一个返回JSON中对象数组的Web服务。我想获取这些对象并使用HTML填充div。假设每个对象都包含一个URL和一个名称。
如果我想为每个对象生成以下HTML:
<div><img src="the url" />the name</div>
这是最好的做法吗?我可以看到一些方法:
答案 0 :(得分:64)
选项#1和#2将是您最直接的选择,但是,对于这两个选项,您将通过构建字符串或创建DOM对象来感受性能和维护的影响。
模板化并不是那么不成熟,你会在大多数主要的Javascript框架中看到它弹出。
这是JQuery Template Plugin中的一个示例,可以帮助您节省性能,实际上非常简单:
var t = $.template('<div><img src="${url}" />${name}</div>');
$(selector).append( t , {
url: jsonObj.url,
name: jsonObj.name
});
我说走了很酷的路线(性能更好,更易于维护),并使用模板。
答案 1 :(得分:13)
如果你必须连接字符串,而不是正常:
var s="";
for (var i=0; i < 200; ++i) {s += "testing"; }
使用临时数组:
var s=[];
for (var i=0; i < 200; ++i) { s.push("testing"); }
s = s.join("");
使用数组要快得多,尤其是在IE中。不久前我用IE7,Opera和FF做了一些字符串测试。 Opera只用了0.4秒就完成了测试,但IE7在20分钟后还没完成! (不,我不是在开玩笑。)随着数组IE非常快。
答案 2 :(得分:8)
前两个选项中的任何一个都是常见且可接受的。
我将在Prototype中给出每个例子。
// assuming JSON looks like this:
// { 'src': 'foo/bar.jpg', 'name': 'Lorem ipsum' }
方法#1:
var html = "<div><img src='#{src}' /> #{name}</div>".interpolate(json);
$('container').insert(html); // inserts at bottom
方法#2:
var div = new Element('div');
div.insert( new Element('img', { src: json.src }) );
div.insert(" " + json.name);
$('container').insert(div); // inserts at bottom
答案 3 :(得分:6)
以下是一个示例,使用我的 Simple Templates 插件进行jQuery:
var tmpl = '<div class="#{classname}">#{content}</div>';
var vals = {
classname : 'my-class',
content : 'This is my content.'
};
var html = $.tmpl(tmpl, vals);
答案 4 :(得分:6)
也许更现代的方法是使用模板语言,例如Mustache,它具有多种语言的实现,包括javascript。例如:
var view = {
url: "/hello",
name: function () {
return 'Jo' + 'hn';
}
};
var output = Mustache.render('<div><img src="{{url}}" />{{name}}</div>', view);
您甚至可以获得额外的好处 - 您可以在其他地方重复使用相同的模板,例如服务器端。
如果您需要更复杂的模板(如果语句,循环等),您可以使用具有更多功能的Handlebars,并且与Mustache兼容。
答案 5 :(得分:4)
您可以在隐藏的div中将模板HTML添加到您的页面,然后使用cloneNode和您喜欢的库的查询工具来填充它
/* CSS */
.template {display:none;}
<!--HTML-->
<div class="template">
<div class="container">
<h1></h1>
<img src="" alt="" />
</div>
</div>
/*Javascript (using Prototype)*/
var copy = $$(".template .container")[0].cloneNode(true);
myElement.appendChild(copy);
$(copy).select("h1").each(function(e) {/*do stuff to h1*/})
$(copy).select("img").each(function(e) {/*do stuff to img*/})
答案 6 :(得分:3)
披露:我是BOB的维护者。
对于您的具体示例:
<div><img src="the url" />the name</div>
这可以通过以下代码使用BOB生成。
new BOB("div").insert("img",{"src":"the url"}).up().content("the name").toString()
//=> "<div><img src="the url" />the name</div>"
或者使用较短的语法
new BOB("div").i("img",{"src":"the url"}).up().co("the name").s()
//=> "<div><img src="the url" />the name</div>"
这个库非常强大,可用于创建非常复杂的数据插入结构(类似于d3),例如:
data = [1,2,3,4,5,6,7]
new BOB("div").i("ul#count").do(data).i("li.number").co(BOB.d).up().up().a("a",{"href": "www.google.com"}).s()
//=> "<div><ul id="count"><li class="number">1</li><li class="number">2</li><li class="number">3</li><li class="number">4</li><li class="number">5</li><li class="number">6</li><li class="number">7</li></ul></div><a href="www.google.com"></a>"
BOB目前不支持将数据注入DOM。这是关于todolist。现在你可以简单地将输出与普通的JS或jQuery一起使用,并将它放在你想要的任何地方。
document.getElementById("parent").innerHTML = new BOB("div").insert("img",{"src":"the url"}).up().content("the name").s();
//Or jquery:
$("#parent").append(new BOB("div").insert("img",{"src":"the url"}).up().content("the name").s());
我创建了这个库,因为我对jquery和d3等任何替代品都不满意。代码非常复杂,难以阅读。在我看来,与BOB合作显然有偏见,更加愉快。
BOB在 Bower 上可用,因此您可以通过运行bower install BOB
来获取它。
答案 7 :(得分:1)
这是最好的做法吗?我可以看到一些方法:
- 连接字符串
- 创建元素
- 使用模板插件
- 在服务器上生成html,然后通过JSON提供。
醇>
1)这是一个选项。在客户端使用JavaScript构建html,然后将其作为一个整体注入到DOM中。
请注意,这种方法背后有一个范例:服务器只输出数据,并且(在交互的情况下)从客户端接收数据与AJAX请求异步。客户端代码作为独立的JavaScript Web应用程序运行。
即使没有服务器启动,Web应用程序也可以运行,渲染界面(当然它不会显示任何数据或提供任何类型的交互)。
这种模式最近经常被采用,并且整个框架都是围绕这种方法构建的(例如参见backbone.js)。
2)出于性能原因,如果可能,最好在字符串中构建html,然后将其作为一个整体注入页面。
3)这是另一种选择,也是采用Web应用程序框架。其他用户已经发布了各种模板引擎。我的印象是你有能力评估它们并决定是否遵循这条道路。
4)另一种选择。但是把它作为纯文本/ html提供;为什么JSON?我不喜欢这种方法,因为将PHP(您的服务器语言)与Html混合在一起。但我经常采用它作为选项 1 和 4 之间的合理折衷。
我的回答:你已经在寻找正确的方向。
我建议像我一样采用 1 和 4 之间的方法。否则采用Web框架或模板引擎。
根据我的经验,我的意见......