- 浏览: 298797 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
全站唯一是我么:
请问下该功能的jdk版本是1.4的么,还是以上的?
Java实现给图片添加水印 -
Janne:
请问,你解决这问题没?是怎么回事?我今天也遇到了,没解决
myeclipse6.5中使用jax-ws启动tomcat报错问题 -
xuedong:
studypi 写道你是怎么和新浪的技术联系的?能告诉一下我吗 ...
新浪微博第三方接口调用学习 -
studypi:
你是怎么和新浪的技术联系的?能告诉一下我吗,谢谢
新浪微博第三方接口调用学习 -
dove19900520:
有用,呵呵
IE,Firefox都不放弃(兼容性问题总结)
现在的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>
发表评论
-
js在Replace中使用正则
2012-08-13 13:37 981replace方法的语法是:str ... -
js中获取时间new Date()详细介绍
2011-09-23 20:37 1458var myDate = new Date(); myDate ... -
全面理解javascript的caller,callee,call,apply概念(修改版)
2011-09-05 18:16 866在提到上述的概念之前,首先想说说javascript中函数的隐 ... -
jquery的live绑定事件,不知道是不是jquery的bug
2011-09-05 18:03 1722今天无意中发现,级联菜单中,select的onchange事 ... -
JS删除数组元素
2011-09-02 14:55 1613、JS删除数组元素 view ... -
js 判断某个方法是否存在
2011-08-25 19:59 1219function fnExist(fnName) { ... -
正则表达式常用验证
2011-08-24 12:20 859在前台很多地方需要验证输入格式,为了方便以后使用,把常用的整理 ... -
勿重复检测浏览器
2011-08-19 09:53 870拿添加事件示例 Js代码 // ... -
学习Javascript闭包(Closure)
2011-08-12 18:10 903闭包(closure)是Javas ... -
深入理解Javascript闭包 .
2011-08-12 17:56 673最近在网上查阅了不少Javascript闭包(closu ... -
IE,Firefox都不放弃(兼容性问题总结)
2011-08-11 16:00 1343下面是Javascript的IE和Fire ... -
jquery ul li mouseout 事件冒泡的bug
2011-08-11 15:48 2641今天碰到个jquery的mouseout事件的问题,弄了半天 ... -
onchange,onpropertychange,oninput键盘输入和js赋值时区别
2011-08-10 15:32 3844最近项目中需要用到文本框中值改变时触发某个事件,第一反应就是 ... -
JavaScript中setAttribute用法
2011-08-10 11:30 1086我们经常需要在JavaScript中给Element动态 ... -
window.location.hash属性介绍
2011-08-08 17:52 887window.location.hash属性介绍 ... -
关于图片的预加载,你所不知道的
2011-08-08 11:36 929看完了曼联与曼城的同城德比,还有漫长的两个小时,才能看到期 ... -
js判断图片是否被缓存
2011-08-05 17:35 2263在ie8下测试是可以的,别的没测。有用到的可以自己测试下,呵 ... -
javascript文件在IE缓存中的迷惑与解惑实验
2011-08-05 17:12 1371javascript文件在IE缓存中的迷惑与解惑实验 缓 ... -
highcharts实现雷达图效果
2011-08-03 11:00 11870最近项目中用到了雷达图,自己在那鼓捣了一顿总算出来一个雏形, ... -
js星星评分效果
2011-08-01 22:57 3368一个页面多个评分效果 js星星评分的代码在网上一搜就是一 ...
相关推荐
例如,在IE7浏览器中,使用Dom Level 0 Event进行事件绑定的页面渲染时间可能达到670ms,而这种性能开销在对比其他两种事件绑定方式(即使用Element的onclick属性和attachEvent方法)时显得尤为显著。 文章进一步...
1.将事件作为html的属性直接写在html代码中 1. 事件的绑定方式不同 2. DOM Level 2将事件分为三个阶段,而DOM Level 0则没有,默
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 ...
在W3C的2级DOM事件标准中,引入了更多通用属性,如`event.bubbles`(判断事件是否冒泡)、`event.cancelable`(决定是否可以取消事件的默认行为)和`event.currentTarget`(当前处理事件的元素,不同于`event.target...
在Vue框架中,页面动态更新是非常常见的需求,但有时候开发者可能会遇到在页面上进行DOM操作不生效的问题。这种情况通常发生在某些数据更新之后,但直接进行DOM操作时,并没有取得预期效果。Vue使用的是虚拟DOM...
在IT领域,尤其是在Web开发和数据抓取方面,"谷歌获取网页DOM的插件"是一种非常实用的工具。DOM(Document Object Model)是HTML和XML文档的结构化表示,它将网页内容作为树形结构处理,使得我们可以方便地通过...
在具体的实现过程中,需要注意iframe中的内容必须和主页面出于同一个域中,否则会受到浏览器同源策略的限制,无法获取到其中的DOM元素。这是因为浏览器安全策略不允许跨域访问DOM。 首先,确保iframe元素在HTML页面...
在给定的标题“DOM解析器 动态修改当前页面”中,核心概念是利用DOM解析器来对网页进行实时的分析与修改。 DOM解析器的工作原理是将网页内容解析成一个树形结构,称为DOM树,每个节点代表了HTML元素、属性、文本或...
7. **DOM Level**:DOM分为不同的级别,如DOM Level 1、DOM Level 2和DOM Level 3,每级扩展了更多的功能,如DOM Level 2引入了CSS操作,DOM Level 3增加了XML命名空间和比较文档的功能。 8. **性能考虑**:虽然DOM...
8. **DOM Level 2和Level 3**:介绍更高级的功能,如样式操作、事件处理的增强、以及XML支持等。 9. **DOM性能优化**:讲解如何避免不必要的DOM操作以提升页面性能。 “JavaScript DOM文档”部分则专门针对...
例如,要找到页面上的所有链接,可以这样做: ```csharp public List<string> ExtractLinks(HtmlDocument dom) { var links = new List(); foreach (var link in dom.DocumentNode.SelectNodes("//a[@href]")) {...
在网页开发中,有时我们需要在不同的HTML页面之间进行交互,比如在一个页面中操作另一个页面的DOM元素或调用其JavaScript变量和函数。这种交互通常发生在父子页面(通过iframe)或打开窗口与母窗口之间。本篇文章将...
在网页开发中,有时我们需要对页面的某个特定DOM(文档对象模型)元素进行截图,例如为了分享、保存或分析特定内容。"WEB中截屏某一个DOM"的技术就是实现这一功能的方法。它允许我们捕获页面上指定ID或具有特定属性...
6. **DOM Level和版本**: DOM有多个级别,如DOM Level 1、DOM Level 2和DOM Level 3,每个级别都扩展了之前的API并引入了新功能。2010版的DOM文档可能包含了这些不同级别的规范。 7. **性能优化**: 对DOM的频繁操作...
8. **DOM Level 2和Level 3**:除了基本的DOM Level 1,书中还介绍了更高级的DOM Level 2(如CSS选择器支持、遍历和范围接口)和DOM Level 3(如事件模型、核心DOM接口和XML DOM接口)。 9. **实践项目**:源码中的...