使用createDocumentFragment的渲染数据(节省性能)

调用多次document.body.append(),每次都要刷新页面一次。效率也就大打折扣了,

而使用document.createDocumentFragment()创建一个文档碎片,
把所有的新结点附加在其上,然后把文档碎片的内容一次性添加到document中,

这也就只需要一次页面刷新就可。

下面是我做的2个实例,一个使用了createDocumentFragment,一个没有使用createDocumentFragment

demo,以及渲染时间截图:

感兴趣的朋友可以自己手动加点数据试试createDocumentFragment有多节省性能

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>使用createDocumentFragment</title>
</head>
<style type="text/css">
    *{margin:0px;padding: 0px;}
    li{list-style:none;}
    .box{width:600px;margin:10px auto;}
    .box ul li{width:578px;padding:10px;margin-bottom:10px;border:1px solid #000;
        overflow:hidden;}
    .box ul li a{color:#999;width:100%;height:30px;line-height: 30px;border-bottom: 1px dashed #ccc;color:#000;
        text-decoration: none;}
    .box ul li p{color:#ccc;line-height:1.6em;}
    #time{width:100%;color:#f00;text-align:center;font-size:18px;margin-bottom: 20px;}
</style>
<body>
    <div id="box" class="box">
        <ul id="target">

        </ul>
    </div>
    <div id="time"></div>
</body>
<script type="text/javascript" src="http://static.qiyi.com/js/common/jquery-1.7.2.min.js" type="text/javascript"></script>
<script type="text/javascript">
    var target=$(‘#target‘);
    var oLi=$(‘.box>ul>li‘);
    var time=$(‘#time‘);
    var oHtml=‘‘;
    var data={
        pageInfor:[
                {
            "title":"html5",
            "desp":"万维网的核心语言、标准通用标记语言下的一个应用超文本标记语言(HTML)的第五次重大修改(这是一项推荐标准[1] 、外语原文:W3C Recommendation、见本处参考资料原文内容:[1] )。"
            },

            //想象这个后边还有N条数据

        ]
    }
    function render(){
        var beginTime=new Date().getTime();
        var oFragment = document.createDocumentFragment();
        for(var i=0;i<data.pageInfor.length;i++){
            var oTitle=data.pageInfor[i].title;
            var oDesp=data.pageInfor[i].desp;
            var tmpl=[
                ‘<a href="#">‘+oTitle+‘</a>‘,
                ‘<p>‘+oDesp+‘</p>‘,
            ];
            var str=tmpl.join(‘‘);
            var oLi=$(‘<li></li>‘);
            oLi.html(str);

            oFragment.appendChild(oLi[0]);
        }
        target[0].appendChild(oFragment);
        var endTime=new Date().getTime();
        var differenceTime=‘使用createDocumentFragment的渲染数据总时长‘+(endTime-beginTime)+‘毫秒‘;
        time.html(differenceTime)
    }
    render();
</script>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>没有使用createDocumentFragment</title>
</head>
<style type="text/css">
    *{margin:0px;padding: 0px;}
    li{list-style:none;}
    .box{width:600px;margin:10px auto;}
    .box ul li{width:578px;padding:10px;margin-bottom:10px;border:1px solid #000;
        overflow:hidden;}
    .box ul li a{color:#999;width:100%;height:30px;line-height: 30px;border-bottom: 1px dashed #ccc;color:#000;
        text-decoration: none;}
    .box ul li p{color:#ccc;line-height:1.6em;}
    #time{width:100%;color:#f00;text-align:center;font-size:18px;margin-bottom: 20px;}
</style>
<body>
    <div id="box" class="box">
        <ul id="target">

        </ul>
    </div>
    <div id="time"></div>
</body>
<script type="text/javascript" src="http://static.qiyi.com/js/common/jquery-1.7.2.min.js" type="text/javascript"></script>
<script type="text/javascript">
    var target=$(‘#target‘);
    var oLi=$(‘.box>ul>li‘);
    var time=$(‘#time‘);
    var oHtml=‘‘;
    var data={
        pageInfor:[
            {
            "title":"html5",
            "desp":"万维网的核心语言、标准通用标记语言下的一个应用超文本标记语言(HTML)的第五次重大修改(这是一项推荐标准[1] 、外语原文:W3C Recommendation、见本处参考资料原文内容:[1] )。"
            },

            //想象这个后边还有N条数据

        ]
    }
    function render(){
        var beginTime=new Date().getTime();
        for(var i=0;i<data.pageInfor.length;i++){
            var oTitle=data.pageInfor[i].title;
            var oDesp=data.pageInfor[i].desp;
            var tmpl=[
            ‘<li>‘,
                ‘<a href="#">‘+oTitle+‘</a>‘,
                ‘<p>‘+oDesp+‘</p>‘,
            ‘</li>‘
            ];
            var str=tmpl.join(‘‘);
            oHtml+=str;
            target.html(oHtml)
        }
        var endTime=new Date().getTime();
        var differenceTime=‘没使用createDocumentFragment的渲染数据总时长:‘+(endTime-beginTime)+‘毫秒‘;
        time.html(differenceTime)

    }
    render();
</script>
</html>

时间: 2024-11-03 20:46:02

使用createDocumentFragment的渲染数据(节省性能)的相关文章

JavaScript 如何工作:渲染引擎和性能优化技巧

翻译自:How JavaScript works: the rendering engine and tips to optimize its performance 这是探索 JavaScript 及其构建组件专题系列的第 11 篇.在识别和描述核心元素的过程中,我们分享了在构建 SessionStack 时使用的一些经验法则.SessionStack 是一个需要鲁棒且高性能的 JavaScript 应用程序,它帮助用户实时查看和重现它们 Web 应用程序的缺陷. 当构建 Web 应用程序时,

渲染数据的方式

渲染数据的四种方式: 1.字符串拼接 案例: ·   字符串拼接的优点:只进行一次Dom回流        缺点:原有Dom的事件都会丢失   原因:innerHTML    这个属性返回或设置Dom中的内容 ,以字符串返回,所以这些onmouse 系列事件就会消失. (补充:DOM 回流   :  每当对Dom元素进行增删改的时候,浏览器会重新加载一个,把新的页面渲染出来) 2.Dom循环 案例: Dom循环    优点: 原有Dom身上的事件不会丢失,不会影响其他Dom      缺点: d

渲染数据方式

一.什么是渲染数据 就是HTML中要显示的数据是通过js来实现的而不是直接在HTML中输入数据,这个过程叫做数据渲染 二.渲染数据的方式 案例分析: 1.字符串拼接(最为常用的方式) 优点:只进行了一次Dom回流 缺点:原有dom的事件都会丢失 原因:就在与innerHTML这个属性,这个属性是返回或设置Dom中的内容,以字符串形式返回,拼接完之后是string类型,而onmouse这些属性是Dom元素对象身上的,所以这些onmouse系列的属性就丢失了. 2.dom循环 优点:原有的dom身上

.NET批量大数据插入性能分析及比较

原文:.NET批量大数据插入性能分析及比较 数据插入使用了以下几种方式 1. 逐条数据插入2. 拼接sql语句批量插入3. 拼接sql语句并使用Transaction4. 拼接sql语句并使用SqlTransaction5. 使用DataAdapter6. 使用TransactionScope及SqlBulkCopy7. 使用表值参数 数据库使用SQL Server,脚本如下 create table TestTable(Id int ,Name nvarchar(20)) 程序中生成测试Dat

&quot;Entity Framework数据插入性能追踪&quot;读后总结

园友莱布尼茨写了一篇<Entity Framework数据插入性能追踪>的文章,我感觉不错,至少他提出了问题,写了出来,引起了大家的讨论,这就是一个氛围.读完文章+评论,于是我自己也写了个简单的程序试了试. 先晒一下代码: 两个简单的类: 1: /// <summary> 2: /// 消费者 3: /// </summary> 4: public class Consumer 5: { 6: public int CId { get; set; } 7: public

使用Exp和Expdp导出数据的性能对比与优化

1.前言 数据备份对信息系统的安全运行至关重要,我们的用户中,使用RMan或第三方专业备份软件的越来越多,但是很多用户仍然保留了传统的Exp作为备份策略的一部分,主要是由于这种备份方式简单易用,而且恢复到其他机器上也很方便,所以,虽然有其他的备份方式,但是Exp方式仍然会同时使用,甚至还有不少的用户只有这种备份方式. 随着用户的数据量增长,Exp导出方式存在的问题也日渐突出,主要就是耗时长,有的甚至超过3个小时,加上常见的后台自动作业:汇总表的计算,自动费用的计算,统计信息的收集等工作,使一个晚

【使用jdbc操作时,如何提取数据的性能】

1.1     使用JDBC操作数据库时,如何提升读取数据的性能?如何提升更新数据的性能? 答:要提升读取数据的性能,可以指定通过结果集(ResultSet)对象的setFetchSize()方法指定每次抓取的记录数(典型的空间换时间策略):要提升更新数据的性能可以使用PreparedStatement语句构建批处理,将若干SQL语句置于一个批处理中执行.

vue2.* 目录结构分析 数据绑定 循环渲染数据 数据渲染02

一.目录 结构分析 node_modules:项目依赖文件(也可以说是模块) src:开发时所用的资源 assets:静态资源文件 App.vue:根组件(最基础的公共页面) main.js:实例化vue,引入基础组件 package.json:项目配置文件(管理项目的名称,版本号,需要的模块等) vue.config.js:vue配置文件 二. 数据绑定  循环渲染数据 数据渲染 <template> <div id="app"> <!-- 绑定数据 -

数据库插入或者更新大批量数据的性能优化

对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长.特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久.因此,优化数据库插入性能是很有意义的. 经过对MySQL InnoDB的一些性能测试,发现一些可以提高insert效率的方法,供大家参考参考. 1.一条SQL语句插入多条数据 常用的插入语句如: INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) VALUE