关于使用JS创建和附加元素的良好实践
About good practices for creating and appending elements with JS
示例代码
var jqxhr=$.getJSON("http://search.twitter.com/search.json?callback=?",{q:query},
function(data) {
... question.
});
问题
现在我需要为每个推特结果创建这样的东西(例如…)
<article class="tweet">
<header>
<img class ="tweet_img"src="data.profile_image_url"/>
</header>
<p class="tweet-text">data.text</p>
</article>
好吧,我知道几种将每个结果附加到文档中的方法:
- 创建一个大的HTML字符串,添加JSONP中的数据,并将其附加到某个容器中
- 创建一个p元素,一个头元素。。。使用它们,然后将最后一个元素附加到某个容器中
现在的问题是:根据你的经验,正确的方法是什么
我的意思是用正确的方法使用好的原则。
请不要问html,这是个愚蠢的例子
谢谢
好吧,最佳实践会告诉您不要使用DOM元素的innerHTML属性,这就是选项1所要做的。但是,除非您担心立即使用Javascript对代码进行操作、附加事件或标记注入的安全问题(我不知道这是一个多大的问题),否则创建一个HTML字符串并使用innerHTML插入它将更快、更容易更新。
有几种有效的方法,每种方法都有自己的优势。。。
在java代码中仅将HTML生成为字符串并添加.innerHTML的技术是已知的执行速度最快的方法之一。。。但它对HTML的验证作用很小。
或者,您可以直接使用DOM方法构建HTML,创建标记并附加它们来构建结构。这通常更安全,因为您有更多的验证正在进行,但DOM方法非常冗长,这使它们在键入时有点痛苦。。。而且代码更加详细,因为您还必须一次添加一个属性。
我个人的偏好,尤其是因为您已经在使用JQuery,应该使用JQuery构建标签和文本节点,并使用JQuery将它们组合在一起,这允许您以一口大小、更人性化的可验证单元进行操作,而不会变得过于冗长。
这还有一个优点,即JQuery生成新标记的方法为不遵守DOM标准的旧浏览器提供了额外的支持。希望您实际上不必关心您的页面是否适用于那些较旧的浏览器,但更高的兼容性也不会有任何影响。
在这种方法中,您可以编写如下内容:
var article = $('<article class="tweet"></article>');
var header = $('<header></header>');
var image = $('<img class="tweet_img" src="' + data.profile_image_url + '"></img>');
var tweet = $('<p class="tweet-text">' + data.text + '</p>');
header.append(image);
article.append(header, tweet);
$("#id_of_content_area_to_add_the_tweet_to").append(article);
我所知道的最干净的方法是使用Mustache这样的模板系统,而不是"JS中的HTML"
var template = html_string, //HTML from a string or from AJAX
data = {...data...}, //structured data
html = $(Mustache.render(template,data)); //wrap in jQuery to operate
html.appendTo(somewhere_in_DOM);
如果要将一些事件处理程序附加到元素,则应单独生成它们。
但如果你不想附加任何事件处理程序,那么我会推荐第一种方法
$("body").append('<article class="tweet"><header><img class ="tweet_img" src="'+data.profile_image_url+'"/></header><p class="tweet-text">'+data.text+'</p></article>')
我建议您使用一些模板引擎,如Handlebars.js,这是解决您问题的正确方法。
它有更多的选项,有更多的条件选项,这些选项在功能上很有用。只要访问上面的链接,你就会有一些想法。
- JQuery添加元素需要在我的js之前再次添加JQuery脚本
- 是否有一个JS/jQuery函数可以获取某个类的每个元素的ID
- 使用CSS或js,使用动态选择器选择任意li的下一个元素
- HTML 显示/隐藏元素 JS 不起作用
- 定位 d3 上的其他元素.js事件上
- 如何获取
- 元素 js/ajax 的 Id 值
- 从元素 JS 中获取类
- 单击 html 元素 JS
- 数据未追加到车把中的元素.js
- 如何使用节点逐个获取元素.js Cheerio
- MEJS(媒体元素JS)播放功能
- 检测是否在输入元素JS中输入了特殊字符
- 如何根据下拉选择消除HTML表单中的元素?(JS吗?)
- 带有动态链接标记的可满足元素(JS、jQuery)
- 仅为UL的第一个元素(JS或jquery)添加类的样式
- 自动时间元素js
- 可以't获取API响应的特定元素[JS]
- 修改指定li元素JS的父级
- 奇异:CSS转换元素JS "点击通过"
- 通过文本框获取数组元素(JS验证)