`
xuedong
  • 浏览: 298797 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

给页面加速,干掉Dom Level 0 Event

阅读更多

现在的web应用越来越复杂,需要响应各种各样的用户触发事件,因而也就不可避免的,需要给我们的html页面上的dom元素增加事件监听函数.

我们知道给dom元素绑定事件监听函数的方法有如下3种:

1 :  页面html:

<button onclick=”test();”></button>
 

2:  页面html:

<button id=”btn”></button>

 Javascript:

document.getElementById(“btn”).onclick = test;

 3:   页面html:

<button id=”btn”></button>

 Javascript:

document.getElementById(“btn”).atachEvent(“onclick”,test); //ie

这3种方法的功能效果和差异,大家都了解,在此就不在赘述了,但是这3种方法,对页面渲染的速度,资源的消耗,却是有很大不同的.

正文后面的html代码是一个demo页面,大家可以用ie浏览器打开,通过注释不同的代码段,查看页面运行效果.

可以看到第一种方式的效率是最低的,随着页面节点的增多,页面渲染时间急剧增加,在ie7下运行,大概670ms;

第二种方式明显好一些,在ie7下,大概250ms

而第三种方式则是最快的方法,也是web前端开发推荐的标准写法,在ie7下,大概188ms;

然后我们去掉事件绑定的逻辑,发现只渲染dom元素,不绑定事件的时间,仅仅125ms,可见事件绑定的时间消耗还是很大的 ,尤其是第一种方式,也就是Dom Level 0 Event,最为耗时.

另外,大家运行各段代码的时候,不妨打开任务管理器,找到浏览器对应的进程,查看代码运行时cpu的消耗以及内存的使用.

我们可以看到,Dom Level 0 Event,对cpu的消耗明显要高很多.

对内存的消耗分析:

重新打开浏览器,空白页面的内存占用量大概是37M,虚拟内存为28M,页面渲染后:

1        内存使用 54M,虚拟内存41M

2        内存使用44M,虚拟内存31M

3        内存使用44M,虚拟内存31M

可见Dom Level 0 Event对内存的消耗,也远远超出了其它方式.

为什么Dom Level 0 Event会这么消耗系统资源呢?对cpu和内存的消耗都远远超出了其它方式.我们来做一个简单分析.

为了便于分析,我们不妨修改一下我们的代码  <button onclick=”debugger;test();”></button> ,然后运行页面,在ie的script debugger里我们找到堆栈调用这一项,可以看到有一个anonymos function,这个function是从何而来的呢.原来浏览器在对Dom Level 0 Event做绑定的时候,会自动生成一个包含我们的代码的匿名函数,然后把这个匿名函数绑定到事件.类似于如下方式:

document.getElementById(“btn”).onclick = function(event){

        test();

} ;

而ie浏览器又没有足够的智能,区分出众多内部功能完全一致的匿名函数并合并它们的引用,所以导致了随着dom事件绑定的越来越多,匿名函数的个数也越来越多.因为要声明数量众多的事件处理匿名函数,也就不难明白,为什么会消耗如此多的系统资源了.

随着dom元素的增多,这个资源消耗就会越来越严重.而且我们可以尝试着刷新一下页面,发现随着刷新的次数增加,页面运行越来越慢,cpu消耗也越来越多,内存也会有少量增加.可见,Dom Level 0 Event 还会带来少量的内存泄露.至于时间的延长,cpu消耗的加聚,推测是因为浏览器忙于释放众多的匿名函数所占用的资源所带来的后果.

进一步深入,由于ie浏览器是基于冒泡的事件模型,子元素的event会冒泡到父元素,所以更极致的优化,是去掉众多子元素的事件绑定,而将事件绑定到父元素,在正文后的demo中,也有这方面的尝试,可以看到不仅cpu,内存消耗最低,时间上也跟渲染干净的html页面是一样的.

所以我们在页面事件绑定中,要尽量避免Dom Level 0 Event,而且要尽可能的将事件上升.(当然也要考虑事件处理的灵活性).

demo:

<BODY> <ul id="list"></ul> <SCRIPT LANGUAGE="JavaScript"> <!-- var $ = function(id){ return document.getElementById(id) }; function test(){ alert(1) } var ul = $("list"); var count = 5000; // ie7 //--> </SCRIPT> <script> var d = new Date() var str = []; for(var i = 0;i<count;i++){ str.push('<li onclick="test();">'+i+'</li>') } ul.innerHTML = str.join(""); alert(new Date - d); //670 刷新时时间增加 85 </script> <SCRIPT LANGUAGE="JavaScript"> <!-- /*var d = new Date() var str = []; for(var i = 0;i<count;i++){ str.push('<li>'+i+'</li>') } ul.innerHTML = str.join(""); alert(new Date - d); */ //125 //--> </SCRIPT> <SCRIPT LANGUAGE="JavaScript"> <!-- /*var d = new Date() var str = []; for(var i = 0;i<count;i++){ str.push('<li>'+i+'</li>') } ul.innerHTML = str.join(""); var li = document.getElementsByTagName("li"); var l = li.length; for(var i=0;i<l;i++){ li[i].onclick = test; } li = null; alert(new Date - d);*/ //250 //--> </SCRIPT> <SCRIPT LANGUAGE="JavaScript"> <!-- /*var d = new Date() var str = []; for(var i = 0;i<count;i++){ str.push('<li>'+i+'</li>') } ul.innerHTML = str.join(""); var li = document.getElementsByTagName("li"); var l = li.length; for(var i=0;i<l;i++){ li[i].attachEvent("onclick",test); } li = null; alert(new Date - d);*/ //188 //--> </SCRIPT> <SCRIPT LANGUAGE="JavaScript"> <!-- /*var d = new Date() var str = []; for(var i = 0;i<count;i++){ str.push('<li>'+i+'</li>') } ul.innerHTML = str.join(""); ul.attachEvent("onclick",test); alert(new Date - d);*/ //125 //--> </SCRIPT> </BODY>
分享到:
评论

相关推荐

    给页面渲染时间加速 干掉Dom Level 0 Event

    例如,在IE7浏览器中,使用Dom Level 0 Event进行事件绑定的页面渲染时间可能达到670ms,而这种性能开销在对比其他两种事件绑定方式(即使用Element的onclick属性和attachEvent方法)时显得尤为显著。 文章进一步...

    ScholatLouis#JavaScript#[1]DOM Level 0 与 DOM Level 2事件1

    1.将事件作为html的属性直接写在html代码中 1. 事件的绑定方式不同 2. DOM Level 2将事件分为三个阶段,而DOM Level 0则没有,默

    HTML DOM基础教程(网页形式)

    DOM Event DOM Form DOM Frame DOM Frameset DOM IFrame DOM Image DOM Input Button DOM Input Checkbox DOM Input File DOM Input Hidden DOM Input Password DOM Input Radio DOM Input Reset DOM ...

    HTML DOM Event 对象

    在W3C的2级DOM事件标准中,引入了更多通用属性,如`event.bubbles`(判断事件是否冒泡)、`event.cancelable`(决定是否可以取消事件的默认行为)和`event.currentTarget`(当前处理事件的元素,不同于`event.target...

    解决vue页面DOM操作不生效的问题

    在Vue框架中,页面动态更新是非常常见的需求,但有时候开发者可能会遇到在页面上进行DOM操作不生效的问题。这种情况通常发生在某些数据更新之后,但直接进行DOM操作时,并没有取得预期效果。Vue使用的是虚拟DOM...

    谷歌获取网页dom的插件

    在IT领域,尤其是在Web开发和数据抓取方面,"谷歌获取网页DOM的插件"是一种非常实用的工具。DOM(Document Object Model)是HTML和XML文档的结构化表示,它将网页内容作为树形结构处理,使得我们可以方便地通过...

    Jquery方式获取iframe页面中的 Dom元素

    在具体的实现过程中,需要注意iframe中的内容必须和主页面出于同一个域中,否则会受到浏览器同源策略的限制,无法获取到其中的DOM元素。这是因为浏览器安全策略不允许跨域访问DOM。 首先,确保iframe元素在HTML页面...

    dom解析器 动态修改当前页面

    在给定的标题“DOM解析器 动态修改当前页面”中,核心概念是利用DOM解析器来对网页进行实时的分析与修改。 DOM解析器的工作原理是将网页内容解析成一个树形结构,称为DOM树,每个节点代表了HTML元素、属性、文本或...

    dom学习总结

    7. **DOM Level**:DOM分为不同的级别,如DOM Level 1、DOM Level 2和DOM Level 3,每级扩展了更多的功能,如DOM Level 2引入了CSS操作,DOM Level 3增加了XML命名空间和比较文档的功能。 8. **性能考虑**:虽然DOM...

    dom教程 dom文档对象实例教程

    8. **DOM Level 2和Level 3**:介绍更高级的功能,如样式操作、事件处理的增强、以及XML支持等。 9. **DOM性能优化**:讲解如何避免不必要的DOM操作以提升页面性能。 “JavaScript DOM文档”部分则专门针对...

    C#获取HTML源码及生成DOM树

    例如,要找到页面上的所有链接,可以这样做: ```csharp public List&lt;string&gt; ExtractLinks(HtmlDocument dom) { var links = new List(); foreach (var link in dom.DocumentNode.SelectNodes("//a[@href]")) {...

    页面间DOM相互访问

    在网页开发中,有时我们需要在不同的HTML页面之间进行交互,比如在一个页面中操作另一个页面的DOM元素或调用其JavaScript变量和函数。这种交互通常发生在父子页面(通过iframe)或打开窗口与母窗口之间。本篇文章将...

    WEB中截屏某一个DOM

    在网页开发中,有时我们需要对页面的某个特定DOM(文档对象模型)元素进行截图,例如为了分享、保存或分析特定内容。"WEB中截屏某一个DOM"的技术就是实现这一功能的方法。它允许我们捕获页面上指定ID或具有特定属性...

    DOM文档下载

    6. **DOM Level和版本**: DOM有多个级别,如DOM Level 1、DOM Level 2和DOM Level 3,每个级别都扩展了之前的API并引入了新功能。2010版的DOM文档可能包含了这些不同级别的规范。 7. **性能优化**: 对DOM的频繁操作...

    javascript dom编程艺术 第2版 源码

    8. **DOM Level 2和Level 3**:除了基本的DOM Level 1,书中还介绍了更高级的DOM Level 2(如CSS选择器支持、遍历和范围接口)和DOM Level 3(如事件模型、核心DOM接口和XML DOM接口)。 9. **实践项目**:源码中的...

Global site tag (gtag.js) - Google Analytics