JavaScript跨浏览器绑定事件函数的优化
JavaScript作为一门基于事件驱动的语言(特别是用在DOM操作的时候),我们常常需要为DOM绑定各种各样的事件。然而,由于低版本的IE的不给力,在绑定事件和移除事件监听上都与众不同,我们常常需要自己封装一个跨浏览器绑定(移除)事件的函数。跨浏览器添加(移除)DOM事件的一种非常经典的实现代码如下:
//跨浏览器添加事件
function addHandler(target, eventType, handler) {
if(target.addEventListener) { //DOM2 events
target.addEventListener(eventType, handler, false);
} else { //IE
target.attachEvent("on" + eventType, handler);
}
} //跨浏览器移除事件
function removeHanler(target, eventType, handler) {
if(target.removeEventListener) { //DOM2 events
target.removeEventListener(eventType, handler, false);
} else { //IE
target.detachEvent("on", eventType, handler);
}
}
上面代码的实现思路是,首先判断浏览器是否支持DOM2的事件,如果支持,就用addEventListener()进行添加事件,用removeEventListener来移除事件。如果不支持,那么默认就是低版本的ie浏览器了,并使用ie特有的方法。
//添加事件
function addHandler(target, eventType, handler) { //检测浏览器类型,并且重写addHanler方法
if(target.addEventListener) { //DOM2
addHandler = function(target, eventType, handler) {
target.addEventListener(eventType, handler, false);
};
} else { //IE
addHandler = function(target, eventType, handler) {
target.attachEvent("on" + eventType, handler);
};
}
//调用新的函数
addHandler(target, eventType, handler);
} //移除事件removeHanler
function removeHandler(target, eventType, handler) { //检测浏览器类型,并且重写removeHandler方法
if(target.removeEventListener) { //DOM2
removeHandler = function(target, eventType, handler) {
target.removeEventListener(eventType, handler, false);
};
} else { //IE
removeHandler = function(target, eventType, handler) {
target.detachEvent("on" + eventType, handler);
};
} //调用新的函数
removeHandler(target, eventType, handler);
}
需要注意的是,我们在两个函数的最后一行,都调用了被重写了的新函数,比如addHandler(target, eventType, handler);和removeHandler(target, eventType, handler);这是必要的,因为我们用新的函数覆盖了旧的函数,必须要在旧的函数里调用新的函数它才会执行一次。
//绑定事件
var addHandler = document.body.addEventListener ?
function(target, eventType, handler) { //DOM2
target.addEventListener(eventType, handler,false);
} :
function(target, eventType, handler) { //IE
target.attachEvent("on" + eventType, handler);
};
//移除事件
var removeHandler = document.body.removeEventListener ?
function(target, eventType, handler) { //DOM2
target.removeEventListener(eventType, handler, false);
} :
function(target, eventType, handler) { //IE
target.detachEvent("on" + eventType, handler);
}
这种方法,比前面比前面那种更加的“积极”,因为他是在函数调用之前就已经去检测浏览器类型了,调用的时候马上就可以正确的去绑定事件。
JavaScript跨浏览器绑定事件函数的优化的更多相关文章
- Javascript跨浏览器的事件对象
一.跨浏览器的事件对象 var EventUtil = { ///添加事件 addHandler: function (element, type, handler) { if (element.ad ...
- js实现一些跨浏览器的事件方法
用JavaScript实现事件的绑定,移除,以及一些常用的事件属性的获取,时常要考虑到在不同浏览器下的兼容性,下面给出了一个跨浏览器的事件对象: var EventUtil = { on: funct ...
- 跨浏览器的事件对象-------EventUtil 中的方法及用法
什么是EventUti----封装好的事件对象 在JavaScript中,DOM0级.DOM2级与旧版本IE(8-)为对象添加事件的方法不同 为了以跨浏览器的方式处理事件,需要编写一段“通用代码”,即 ...
- EventUtil——跨浏览器的事件对象
. 首页 博客园 联系我 前言:什么是EventUtil?. EventUtil对象全见. addHandler方法. removeHandler方法. event对象与getEvent方法. tar ...
- js事件对象--DOM中的事件对象/IE中的事件对象/跨浏览器的事件对象
事件对象 在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含着所有与事件有关的信息.包括导致事件的元素.事件的类型,以及其他与特定事件相关的信息.例如,鼠标操作导致的事件对 ...
- JavaScript三种绑定事件的方式
JavaScript三种绑定事件的方式: 1. <div id="btn" onclick="clickone()"></div> // ...
- js 跨浏览器实现事件
我们知道不同的浏览器实现事件是不同的,就比如说我们常见的有三种方法: 1,dom0处理事件的方法,以前的js处理事件都是这样写的. (function () { var p=document.getE ...
- js跨浏览器的事件处理函数
/* 跨浏览器的事件处理函数 */ var EventUtil = { addHandler : function(element,type,handler){ if(element.addEvent ...
- 封装常用的Javascript跨浏览器方法
var EventUntil={ // 跨浏览器的添加事件方法 addHandler:function(element,type,handler){ if(element.addEventListen ...
随机推荐
- git中误删提交(commit)后,怎么恢复
“xml文件存储数据”提交被我误操作,即使用reset --hard删除了,然后又进行了三次提交,发现删除的提交有用,需要找回来, 于是找了好久,找到好方法: 1.进入工程下的.git文件下,git ...
- SharePoint online Multilingual support - Development(2)
博客地址:http://blog.csdn.net/FoxDave 上一节讲了如何通过Code的方式设置Site和List级别的国际化,本节介绍一下如何设置Content type和Site co ...
- ESP8266 上报数据到贝壳物联
下面贴上代码: #include <aJSON.h> #include <SPI.h> #include <Wire.h> #include <dht11.h ...
- ios读取plist文件:
@property (nonatomic,strong) NSArray *imageData;//定义一个数组 //懒加载数据 -(NSArray *)imageDate { if(_imageDa ...
- springsecurity启动出现org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: You must use a 3.0 schema with Spring Security 3.0.
在换了spring-security的jar包以后启动出现org.springframework.beans.factory.parsing.BeanDefinitionParsingExceptio ...
- 使用git下载源码及数据文件
初学git,用来下载github上的数据和源代码,具体步骤如下. 1.百度搜索git并下载:本想从github直接下载安装,无奈国外服务器的下载速度太慢,建议国内的直接搜索下载完整安装版. 2.完成g ...
- 如何让你的 React Native 应用在键盘弹出时优雅地响应
原文地址:How to make your React Native app respond gracefully when the keyboard pops up 原文作者:Spencer Car ...
- [转]Poisson Distribution
Poisson Distribution Given a Poisson process, the probability of obtaining exactly successes in tria ...
- js--未来元素
通过动态生成的标签,在生成标签直接绑定事件是无效的. eg:html标签 <div id="tree"> </div> <script> $(' ...
- Foxmail软件添加QQ邮箱报错
#报错现象: -ERR Please using authorized code to login. More information at http://servi 请使用授权代码登录.http:/ ...