在我的应用程序中,我有时需要动态创建元素,所以我在javascript中创建它们,但它使维护变得困难。
例如:
上面的图片是我点击地图中的一个点时的信息窗口,在我们的应用程序中我们有类似的要求,我们使用javascript来创建整个DOM。
我认为这不是一个好主意,有什么建议吗?
答案 0 :(得分:3)
您可以将JS生成的HTML提取到客户端实例化的模板中。查看JQuery模板,例如:
http://api.jquery.com/category/plugins/templates/
示例:
<ul id="movieList"></ul>
<script id="movieTemplate" type="text/x-jquery-tmpl">
<li><b>${Name}</b> (${ReleaseYear})</li>
</script>
<script type="text/javascript">
var movies = [
{ Name: "The Red Violin", ReleaseYear: "1998" },
{ Name: "Eyes Wide Shut", ReleaseYear: "1999" },
{ Name: "The Inheritance", ReleaseYear: "1976" }
];
// Render the template with the movies data and insert
// the rendered HTML under the "movieList" element
$( "#movieTemplate" ).tmpl( movies )
.appendTo( "#movieList" );
</script>
答案 1 :(得分:1)
使用普通jQuery的另一种方法(我不知道Prototype,但我猜你可以做同样的事情):
<div id="template" style="display: none">
Hello, <span class="name">[world]</span>
</</div>
function render(name) {
$('#template').clone().removeAttr('id')
.find('.name').text(name).end()
.appendTo('body').show();
}
render("Stack Overflow");
render("..and world");
这个想法非常简单:将模板隐藏在HTML中。当你需要它时,通过id找到它,删除这个id,替换数据并将新创建的元素添加到你想要的位置。
答案 2 :(得分:0)
你说过你正在使用Prototype。你可以使用它的Template
class。您甚至可以在服务器上存储模板,并根据需要通过ajax加载它们(尽管我担心HTTP请求的数量),以保持代码和标记完全不同。
例如,这是一个用于构建表格行的Prototype模板:
<tr><td>#{name}</td><td>#{description}</td></tr>
您可以选择存储模板文本的位置和方式:
display: none
将它们包含在主页中,将其作为HTML提取,然后重复使用。在所有这三种情况中,最终你得到一个包含模板文本的字符串,例如:
var rowString = "<tr><td>#{name}</td><td>#{description}</td></tr>";
(但同样,您可能不需要将它实际放在JavaScript中。)
从字符串中,您可以制作模板:
var rowTemplate = new Template(rowString);
然后使用它:
$('tableBodyId').insert({
bottom: rowTemplate.evaluate({
name: bizobject.name.escapeHTML(),
description: bizobject.description.escapeHTML()
})
});
请注意(遗憾的是)您必须自己进行HTML转义(因为Prototype的模板不是专门与HTML绑定的,您可以在任何有模板化字符串的情况下使用它们)。或者你可以对Template
类做一个相当小的改动来为你做(这就是我做的,当我使用Prototype时;我实际上可以在模板项上调用函数)。