JQuery执行DOM批量克隆并插入的提效方法
JQuery clone方法可以实现对指定DOM对象的快速复制,并插入文档中。 对于同一类型的对象往往需要按照同一样式模板(HTML标签代码)复制N份并插入文档中,然后再将内容填入模板中,这就需要批量克隆插入,例如你的博客发表的若干篇文章,都具有相同的模板样式(标题 + 内容摘要)。
按照直接的思维逻辑往往会写出 先clone后插入文档,插入使用append preprend或者insertAfter insertBefore接口。此方法导致时间效率低下, 因为每次生成的克隆实例插入文档,都会导致整个文档重绘动作。
设计简单测试用例,对模板template(一个div)进行clone并插入执行5000次,使用Date.getTime来计算耗时(ms),使用chrome浏览器(33)测试耗时4107ms,下面给出代码:
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js">
</script>
</head>
<body>
<div id="template_div">heheiiiii</div>
<script>
var start = new Date().getTime(); for (var i=0; i<5000; i++)
{
$("#template_div").clone().appendTo($("body"));
}
var end = new Date().getTime(); alert(end - start);
</script>
</body>
</html>
考察JQuery append接口定义(https://api.jquery.com/append/),其参数包括数组,数组包括DOM Element:
Similar to other content-adding methods such as
.prepend()and.before(),.append()also supports passing in multiple arguments as input. Supported input includes DOM elements, jQuery objects, HTML strings, and arrays of DOM elements.
借助此特性,为减少页面重绘次数,考虑将每个clone实例缓存到DOM数组中,然后使用append接口一次性将所有实例插入文档,即重绘次数从 5000 减少为 1。 使用相同版本的chrome浏览器,测试这种方法耗时为 636ms,相校未修改前节省3500ms,甚是喜人, 推荐使用。下面给出完整代码:
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js">
</script>
</head>
<body>
<div id="template_div">heheiiiii</div>
<script>
var start = new Date().getTime();
//缓存clone实例
var domCache = [];
for (var i=0; i<5000; i++)
{
domCache.push($("#template_div").clone())
}
$("body").append(domCache);
var end = new Date().getTime();
alert(end - start);
</script>
</body>
</html>
为验证该方法的在各个浏览器上的稳定性,使用上面两则代码,对三个主流浏览器做了对比试验,结果如下表,对于IE浏览器处理效率有明显提升 9s(总体上时间较长,应该源于IE浏览器对JS处理的低效):
| 单位(ms) | Chrome33 | IE8 | Firefox |
| 改进前 | 4107 | 18235 | 2966 |
| 改进后 | 636 | 9203 | 1006 |
JQuery执行DOM批量克隆并插入的提效方法的更多相关文章
- 如何 ︰ 执行批量更新和插入使用.NET 提供程序在 C#.NET OpenXML
https://support.microsoft.com/zh-cn/kb/315968 如何 ︰ 执行批量更新和插入使用.NET 提供程序在 C#.NET OpenXML Email Prin ...
- PG数据库创建并执行存储过程批量插入数据
记录一下PG数据库创建并执行存储过程批量插入数据的SQL: create or replace function addId() returns boolean AS $BODY$ declare i ...
- 解密jQuery内核 DOM操作
jQuery针对DOM操作的插入的方法有大概10种 append.prepend.before.after.replaceWith appendTo.prependTo.insertBefore.in ...
- jQuery的dom操作(二)转
addClass() 向匹配的元素添加指定的类名. after() 在匹配的元素之后插入内容. append() 向匹配的元素内部追加内容. appendTo() 向匹配的元素内部追加内容. attr ...
- jQuery框架-2.jQuery操作DOM节点与jQuery.ajax方法
一.jQuery操作DOM 内部插入操作: append(content|fn):向每个匹配的元素内部追加内容. prepend(content):向每个匹配的元素内部前置内容. 外部插入操作: af ...
- jQuery (DOM篇)
1.DOM节点的创建 创建元素节点: 常见的就是直接把这个节点的结构给通过HTML标记字符串描述出来,通过$()函数处理,$("html结构") $("<div&g ...
- HTML 学习笔记 JQuery(DOM 操作)
一般来说,DOM操作分为三个方面,即:DOM Core(核心), HTML_DOM 和 CSS_DOM. 1.DOM Core DOM Core 并不专属于JavaScript,任何一种支持DOM的程 ...
- jQuery学习笔记(二)jQuery中DOM操作
目录 DOM操作分类 jQuery中的各种DOM操作 查找节点 创建节点 删除节点 复制节点 替换节点 包裹节点 属性操作 样式操作 对HTML.文本和值的操作 遍历节点 CSS-DOM操作 小结 本 ...
- 提高jQuery执行效率需要注意几点
1. 使用最新版本的jQuery jQuery的版本更新很快,你应该总是使用最新的版本.因为新版本会改进性能,还有很多新功能. 下面就来看看,不同版本的jQuery性能差异有多大.这里是三条最常见的j ...
随机推荐
- ACM 阶乘之和
阶乘之和 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3! ...
- 好的 iOS 代码习惯
一,使用别人的框架时,尽量在退出时移除框架创建的对象 if (_giftToastView) { [_giftToastView removeFromSuperview]; _giftToastVie ...
- Java_动态加载
Java类动态加载(一)——java源文件动态编译为class文件最近在做java动态加载这方面的工作,起初也遇到了很多困难.网上关于这方便的东西很零散,为了便于日后回过头来再看,于是我将这几天的心得 ...
- Java语言基础
Java 语言是面向对象的程序设计语言,Java 程序的基本组成单元是类,类体中又包括属性与方法两部分.每一个应用程序都必须包含一个main()方法,含有main()方法的类成为主类. 一.Java ...
- QTabWidget 使用方法
QTabWidget是Qt中的标签类,由于可切换到标签存在,大大的提高了软件可容纳的控件的数量,通过增加标签,我们几乎有用之不尽的空间,那么我们来看看这个类的一些基本用法: 声明控件: QTabWid ...
- [LintCode] Sort Integers II 整数排序之二
Given an integer array, sort it in ascending order. Use quick sort, merge sort, heap sort or any O(n ...
- 细说jQuery原型的创建和实现原理,并用实例简单模仿
在解析jQuery实现机理之前,我们先总结一下几点知识,这些都是我学习路上遇到的坑,我跌倒过很多次,现在把它补上: 1)自定义构造函数,如下例: function person(){ this.nam ...
- 第一章 开始编写第一个jsp
第一章 搭好框架,需要tomcat服务器和jdk. JSP是Java Server Page的缩写,现在先让我们编写一个简单的jsp页面,看看jsp究竟能干什么? <%=new java.uti ...
- struts2--convention-plugin--零配置
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "- ...
- iOS -- AVAudioPlayer播放音乐
一. AVAudioPlayer: 声明音乐控件AVAudioPlayer,必须声明为全局属性变量,否则可能不会播放,AVAudioPlayer只能播 ...