JQuery:通过 DOM 操作插入大量 html - 可维护性?
我发现了关于使用 jquery 插入 dom 元素的良好实践的好帖子,例如 this、这个和这个
当你只需要插入一些元素时就可以了,但在我看来从可维护性的角度来看,这些选项非常糟糕(代码重复两次,因此如果需要任何更改,则需要发生两次,然后很容易出错),
这(只是一小部分)我已经有
<script type="text/javascript">
var phnFragment = "<tr><td align=\"right\">Telephone:</td><td colspan=\"2\"><select name=\"select\" size=\"1\"style=\"width: 100px;\"><option>-- Choose --</option><option>Home</option><option>Mobile</option><option>Work</option></select><input type=\"text\" size=\"20px\" /></td></tr>";
$(document).ready(function() {
$('#addmorephones').click(function() {
$("#phones").append(phnFragment);
});
});
</script>
....
....
<tr id="phones">
<td align="right">Telephone:</td>
<td colspan="2"><select name="select" size="1"
style="width: 100px;">
<option>-- Choose --</option>
<option>Home</option>
<option>Mobile</option>
<option>Work</option>
</select><input type="text" size="20px" /> <a href="javascript:void(0);" id="addmorephones">[+]</a>
</td>
</tr>
没有更好的方法来完成这个?有没有办法告诉jquery复制部分dom树并将其作为片段插入?
很想学习替代方案
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
是:
克隆
。 (你甚至不需要 jQuery;cloneNode
是 DOM API 的一部分。)如果您克隆的内容中有任何id
值,则需要当然,迭代结果会改变它们,因为 id 必须是唯一的。但它非常适合表格行等。在页面加载时,您可以抓取一个真实的模型,克隆它(不将其附加到文档),清除其中不需要的任何内容,然后继续克隆该模型。帮助您的 JavaScript 在某种程度上与您的标记分离。
示例:
HTML:
JavaScript:
Live copy
显然,这是一个快速而肮脏的方法,但你明白了。如果您使用
data-xyz
属性(HTML5 中允许)、name
、class
等,您也可以避免绑定代码与你的结构密切相关。Yes:
clone
. (You don't even really need jQuery for it;cloneNode
is part of the DOM API.) If you have anyid
values in what you clone, you'll need to iterate over the result changing them, of course, sinceid
s have to be unique. But it's perfect for things like table rows and the like.On page load, you can grab one of the real ones, clone it (without attaching it to the document), cleanse it of anything you don't need, and then just keep cloning that model. Helps keep your JavaScript somewhat decoupled from your markup.
Example:
HTML:
JavaScript:
Live copy
Obviously that's a quick-and-dirty, but you get the idea. If you use
data-xyz
attributes (allowed in HTML5),name
s,class
es, etc., you can avoid tying your code too closely to your structure.在这种情况下,您可以在就绪事件期间抓取
#phones
的内容:如果您需要复制更复杂的信息(例如事件),您可以使用.clone() 方法:
In this case, you could grab the contents of
#phones
during the ready event:If you need to copy more complex information (like events), you can use the .clone() method:
如果您有想要重用的现有标记,TJ 有一个很好的答案。您还可以使用 text/html 脚本类型将内容作为模板放入标记中,如下所示:
http://ejohn.org/blog/javascript-micro-template/
T.J. has a great answer if you've got existing markup you want to reuse. You can also use the text/html script type to put your content in markup as a template, as demonstrated here:
http://ejohn.org/blog/javascript-micro-templating/