事件兼容及对内存的影响

 1 var EventUtil={
 2        addHandler:function(element,type,handler){    //为元素添加事件处理程序
 3            if(typeof element.addEventListener=="function"){
 4                element.addEventListener(type,handler,false);   //DOM2
 5            }else if(typeof element.attachEvent=="function"){
 6                element.attachEvent("on"+type,handler);   //IE
 7            }else{
 8               element["on"+type]=handler;    //所有的浏览器都支持
 9            }
10        },
11
12        getEvent:function(event){    //获取包含事件信息的event对象
13            return event?event:window.event;
14        },
15
16        getTarget:function(event){       //获取事件的目标target
17            return event.target||event.srcElement;
18        },
19        getRelatedTarget:function(event){   //获取相关元素,针对mouseover与mouseout事件
20            if(event.relatedTarget){
21                return event.relatedTarget;
22            }else if(event.fromElement){
23                return event.fromElement;
24            }else if(event.toElement){
25                return event.toElement;
26            }else{
27                return null;
28            }
29        },
30        getButton:function(event){    //获取鼠标的按钮,针对mousedown和mouseup事件
31            if(document.implementation.hasFeature("MouseEvents","2.0")){
32                return event.button;
33            }else{
34                switch(event.button){
35                    case 0:
36                    case 1:
37                    case 3:
38                    case 5:
39                    case 7:
40                        return 0; //主鼠标
41                    case 4:
42                        return 1; //中间鼠标
43                    case 2:
44                    case 6:
45                         return 2;  //次鼠标
46                }
47            }
48        },
49         getWheelDelta:function(event){  //鼠标滚动事件
50            if(event.wheelDelta){
51                return event.wheelDelta;
52            }else{
53                return -40*event.detail;
54            }
55        },
56        getCharCode:function(event){   //获取字符编码,针对keypress事件
57            if(typeof event.charCode=="Number"){
58                return event.charCode;
59            }else{
60                return event.keyCode;
61            }
62        },
63        preventDefault:function(event){  //阻止事件的默认行为
64            if(event.preventDefault){
65                event.preventDefault();
66            }else{
67                event.returnValue=false;
68            }
69        },
70        stopPropagation:function(event){  //阻止事件流
71            if(event.stopPropagation){
72                event.stopPropagation();
73            }else{
74                event.cancelBubble=true;
75            }
76        },
77        removeHandler:function(element,type,handler){  //删除事件
78            if(typeof element.removeEventListener=="function"){
79                element.removeEventListener(type,handler,false);
80            }else if(typeof element.detachEvent=="function"){
81                element.detachElement("on"+type,handler);
82            }else{
83                element["on"+type]=null;
84            }
85        }
86    };

创建了一个关于事件的EventUtil对象,通过这个对象调用方法。

内存性能:添加到页面中的事件处理程序的数量直接关系到页面整体的运行性能。一方面是由于函数是对象,对象占用内存,内存中的对象越多,性能就越差。另一方面是由于事先指定事件处理程序会导致对DOM的访问次数增多,会延迟整个页面的交互就绪的时间。下面是提升性能的方法:

  • 事件委托:利用事件冒泡的原理,将事件处理程序添加到DOM中尽可能高的元素节点,从而管理某一类型的所有事件。当触发某一具体元素的事件时,事件会冒泡到添加事件处理程序的元素上,对事件进行处理。这里需要用到事件的target属性来判断事件的真正目标。可以的话,可以考虑为document添加一个事件处理程序,用于处理网页上发生的某一类型的事件:这样对document很快能够访问,只要事件元素出现在页面上就具备交互能力;在页面设置事件处理程序的事件变短;整个页面占用的内存更少,性能进一步提升。
  • 移除事件处理程序:每当将事件处理程序制定给某个元素时,运行在浏览器中的代码就就会与支持JavaScript交互的代码创建一个连接。这种连接越多,页面的运行速度就越慢。(1)通过innerHTML移除带有事件处理程序的元素,由于移除的元素带有事件处理程序,它们保持着引用的关系,所以无法被当作垃圾回收。一方面可以事先手动移除事件,然后再用innerHTML移除元素,另一方面,如果事先知道将来将通过innerHTML移除元素,那就把事件别直接添加到元素上,可添加到委托元素上。(2)卸载页面之前没有清理干净事件处理程序,它们就会滞留在内存中。可在页面卸载前利用onunload事件处理程序移除所用的事件处理程序,利用事件委托添加的事件处理程序越少,越容易移除。
时间: 2024-11-07 21:50:23

事件兼容及对内存的影响的相关文章

js 判断浏览器关闭事件 兼容所有浏览器

无论是从页签处关闭浏览器,还是关闭整个浏览器窗口,无论是 ie11,火狐,谷歌,苹果,还是ie6,都能兼容的浏览器关闭事件监听 在网上搜索了一天,虽然网上也有之类的代码,但是太繁琐,有时候还不可用.我也是在原有基础上修改的.经过了上述的浏览器测试,如果有不兼容的,欢迎提出意见一起学习. ? <script type="text/jscript" src="jquery-1.10.2.min.js"></script> <script t

一些web事件兼容(根据高级程序)

var EventUtil = { //事件监听 addHandler: function( element, type, handler ) { if ( element.addEventListener ) { element.addEventListener(type, handler, false); } else if ( element.attachEvent ) { element.attachEvent("on" + type, handler); } else { e

javascript——事件兼容(部分)

<!--跨浏览器事件兼容--> <!DOCTYPE HTML> <html> <head> </head> <meta charset="utf-8"> <body> <div> <a href="http://www.baidu.com" id="al" >Click Me</a> </div> </body

windows phone和android,ios的touch事件兼容

1.开发背景 最近用html5写了个小游戏,中间踩过无数坑,有很多甚至百度都百度不到答案,可见html5还真是不成熟,兼容性的复杂度比ie6有过之而无不及,性能那个渣简直无力吐槽.. 好了,吐槽结束,虽然有这么多的缺点,但是由于其良好的跨平台前景以及极低的学习成本,再加上优秀的框架,我最终还是选择了用html5来开发这个小游戏,而且是小游戏,所以就没有用什么游戏开发框架了,只是自己简单的封装了一个,因此所有的bug都被我走了一遍..正当我调试完所有的android上的bug之后,心想自己的努力不

案例描述:不同类型变量顺序保存时,变量强制转换对变量内存的影响。

大家都知道c语言变量的存储是从小到大增加. address c :FF39 address n :FF3A 并没有改变c和n的地址. address c :FF39 address n :FF3A 但是c的值被改变了, c的值变成了-127. 上述实验表明了变量的强制转换并不会对变量的存放地址产生影响,只会对变量的值产生影响.案例描述:不同类型变量顺序保存时,变量强制转换对变量内存的影响.

js事件兼容处理

var eventUtil = { bindEvent: function(el, type, target, callback, popgation) { /** * @author zhangtian * @date 2017/11/16 * @desc 标准浏览器与ie事件兼容处理 * @augments el:事件源 type事件类型 callback回调函数 popgation是否冒泡 * @todo ie8下调用stopPropagation 无效,知道原因的园工请留言告知或者发邮件

原生js绑定和解绑事件,兼容IE,FF,chrome

主要是最近项目中用到了原生的js 解绑和绑定 事件  然后今天研究了一下,其实问题不大,不过要注意不要把单词写错了,今天我就找了好久单词写错了. 需求:当鼠标移上去以后,给Select加载元素,接着解除这个事件.贴上代码,这个是可以运行的,兼容 IE FF chrome 1 <html> 2 <head> 3 <meta http-equiv="Content-Type" content="text/html; charset=gb2312&qu

Release编译模式下,事件是否会引起内存泄漏问题初步研究

记:不常发生的事件内存泄漏现象 想必有些朋友可能也常常使用事件,但是很少解除事件挂钩程序也没有听说过内存泄漏之类的问题.幸运的是,在某些情况下,的确不会出问题,很多年前做的项目就跑得好好的,我们静态可以做一个实验来再次验证下.为了验证这个问题,我一度怀疑自己代码写错了,甚至照着书上(网上)例子写也无法重现事件引起内存泄漏的问题,难道教科书说错了么? 首先来看看我的代码,先准备2个类,一个发起事件,一个处理事件: class A { public event EventHandler ToDoSo

Js键盘事件全面控制,回车按键事件,键盘对应按键码,按键事件兼容各个浏览器。

作者:827969653 在网上查询的按键码如下: 一.键盘按键和键盘对应代码表:   字母按键码A <--------> 65 B <--------> 66 C <--------> 67 D <--------> 68 E <--------> 69 F <--------> 70 G <--------> 71 H <--------> 72 I <--------> 73 J <--