Javascript性能:构建和注入html的最快方式
Javascript performance: Fastest way of building and injecting html
这适用于单页移动web应用程序。。。。
为了可读性,我一直在连接我的html,然后注入。我很确定还有一种更有效的方法,我想听听js专家的意见!
这是我的一个串联html字符串的例子。。。
var html_str = '';
$.each(events_array, function(k, ev_type){
if( localStorage.getItem('show_type'+ev_type.type_num) !== 'false' ){
$.each(ev_type, function(k2, e){
if(typeof e != 'string'){
if(fav_mode && last_date_num != e.date){
html_str += '<li class="date">'+e.date_text+'</li>';
last_date_num = e.date;
}
html_str += '<li';
if(fav_mode | (FAVOURITES && $.inArray(parseInt(e.event_id), FAVOURITES) >= 0) ){
html_str += ' class="fav"';
}
html_str += '>';
html_str += '<div class="l_'+e.gig_club+'"></div>';
html_str += '<p rel="'+e.event_id+'"><span>'+e.venue+' : </span>'+e.nameofnight+'</p>';
html_str += '</li>';
}
});
}
});
return html_str
没有"最快"。浏览器只有"最快"。
有3种常见的技术。HTML字符串操作、模板化和DOM操作。
因为模板可以在内部同时使用HTML字符串操作和DOM,所以为了可读性/可维护性,我建议使用它。
以下是的一些基准
模板
更多模板
移动平台的数据模板
加载模板
Dust-js基准
如果你谈论的是大量的HTML,那么性能是至关重要的
绝对不要:
-
在循环中迭代地注入dom节点。即使在不太大的HTML场景中,这也会影响性能。
-
通过调整属性和在各种元素之间交换内容,尝试使用现有的HTML来节省工作。与前一点一样,即使在不涉及数千个元素的情况下,这也会变得丑陋。当你触发大量回流时,没有将表布局设置为固定的大表可能会变得特别糟糕。
-
使用jQuery的直接字符串到dom构建——IMO实际上对大多数用途来说都很好,因为如果从某一天可能不那么安全的源注入数据,它可以很好地验证讨厌的转义序列。如果使用字符串,请使用html方法从字符串构建和从字符串注入。虽然真的是为了最大性能,但如果我100%信任我的数据,我可能会放弃JQ。
Do:
-
把它全部构建在一个文档片段中,并附加它。或者构建一个HTML字符串并一次将其全部放入。我更喜欢下面"也许"下描述的混合方法,但已经2-3年没有测试过了。这样,浏览器只需要重新绘制页面一次。谷歌"CSS回流"了解更多信息。
-
若您必须对大量HTML进行大量调整,只需更改数据并重新构建整个集合,原因与上述相同。
-
如果从字符串构建,请尽量减少使用"+"运算符的串联,转而使用数组联接。在紧要关头,使用数组建立模板非常有效。
-
如果IE<8是一个令人担忧的问题。如果没有JIT编译器,重复的函数调用可能会变得昂贵。如果它们是内联的(在另一个函数内部定义,没有任何外部返回的引用),那么它们实际上可以在JIT中帮助您。
-
测试你所尝试的一切。除了多个对一个巨大的附加规则之外,其他一切都有灰色地带。多个总是比较慢。
可能:
在传统浏览器中,一个很好的技巧是将HTML大字符串插入到文档片段中,并通过DOM方法附加这些片段。这并不是所有浏览器中速度最快的,但在IE7很重要的时候,这是最好的方法,在现代JIT浏览器中,一块innerHTML、只进入文档片段的DOM方法和混合方法之间的差异几乎可以忽略不计。
我也完全建议使用模板。
但我认为您已经利用了注入HTML的最佳实践:构建HTML,然后一次注入要好得多,而不是多次注入HTML的小片段,因为浏览器可能会在每次注入时重新绘制/回流文档。
显式for
循环肯定会比$.each()
快得多,主要是因为它会为每个元素执行函数调用,但也有其他原因,例如使用新的执行帧,html_str
的查找时间会更长。
有一些经验证据表明(我认为这在旧的浏览器中是有效的,我不确定现在或在移动设备上什么更快,值得一看),将元素添加到数组中(使用循环变量html_str[i]
,而不是html_str.push()
),然后调用.join
比串接更快。
如前所述,添加一个大的DOM字符串比小的追加要快,也比使用DOM方法(appendChild、insertBefore等)快得多
一个好的模板引擎会为你做这些事情(只需要一点额外的成本),尽管我不确定它们中是否有很多能做到。如果只是少量的"模板",那么当一个简单的循环就可以做到这一点时,使用库可能会有些过头了。
您不妨考虑使用documentFragment,尽管它可能不如html字符串那样可读,但它非常有效(性能方面),并且可能以面向对象的方式可读。
您可以访问此页面了解详细信息:http://ejohn.org/blog/dom-documentfragments/
- Windows8应用程序(html&Javascript):从图片库(除了文件选择器)显示图像的另一种方式
- 用DRY方式Javascript/JQuery动态替换HTML
- 通过javascript以编程方式将文件插入HTML输入
- 如何以非编程方式国际化HTML文本
- 当按下箭头键时,我的图像以一种奇怪的方式跳跃(HTML+JS)
- 如何启用Emmet'的选项卡键处理程序(HTML快捷方式)
- 使用相同代码管理多个HTML的最佳方式
- 如何使文本、数字和日期html输入字段以一致的方式支持Ctrl+Z(撤消)
- 如何在使用 UIWebView 编辑 HTML 内容时正确调整输入语言更改 (LTR/RTL) 的文本对齐方式
- HTML + JS:设置文本区域内容样式的最佳方式
- 修改 HTML 的方式使左键应带到下一个 URL
- 使用ajax解析html的最佳方式
- 以非阻塞方式更新HTML画布
- 以类似于谷歌机器人的方式抓取网站html和javascript
- 附加html的不同方式
- 有没有一种方法可以制作一个prezi,然后以某种方式将其转换为html和css类型的代码
- 如果不使用HTML按钮,就无法通过编程方式触发SVG动画
- 显示动画图像的最佳方式(HTML/CSS/JS)
- 构建html的两种方式——.html()和.append()
- 查询方式:HTML / JS