focus 专栏

--专注于.NET Web开发技术
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

动态创建大量 html dom 元素时提升性能

Posted on 2008-02-27 16:52  focus  阅读(666)  评论(0编辑  收藏  举报
考虑以下两种做法:
方法1
<html>
    <head>
        <script>
        function createElements()
        {
            var t1 = new Date();
            for(var i = 0; i < 10000; i++)
            {
                var oP = document.createElement("p");
                oP.innerText 
= "hello world";
                document.all(
"div1").appendChild(oP);
            }
            var t2 = new Date();
            document.all("div2").innerText = "time span is:" + (t2 
- t1) + "ms";
        }
        </script>
    </head>
    <body onload="createElements()">
        <div id="div1" />
        <div id="div2" />
    </body>
</html>

输出结果:
time span is:6718ms

方法2
<html>
    <head>
        <script>
        function createElements()
        {
            var t1 = new Date();
            var oFragment = document.createDocumentFragment();
            for(var i = 0; i < 10000; i++)
            {
                var oP = document.createElement("p");
                oP.innerText 
= "hello world";
                oFragment.appendChild(oP);
            
}
            document.all("div1").appendChild(oFragment);
            var t2 = new Date();
            document.all("div2").innerText = "time span is:" + (t2 
- t1) + "ms";
        }
        </script>
    </head>
    <body onload="createElements()">
        <div id="div1" />
        <div id="div2" />
    </body>
</html>

输出结果:
time span is:1344ms

将新创建的元素临时 append 到一个 document fragment 对象上,全部创建完成之后再将此 document fragment 对象 apped 到 document 上,这样的话只是在 append document fragment 的时候刷新一次 dom,而不使用 document  fragment 对象在每次 append 的时候都会刷新 dom。因此方法二比方法一的性能得到了显著的提升!