javascript浏览器兼容教程之事件处理


Posted in Javascript onJune 09, 2014

1. window.event

【分析说明】先看一段代码

function et()
{ 
alert(event);//IE: [object]
}

以上代码在IE运行的结果是[object],而在Firefox无法运行。

因为在IE中event作为window对象的一个属性可以直接使用,但是在Firefox中却使用了W3C的模型,它是通过传参的方法来传播事件的,也就是说你需要为你的函数提供一个事件响应的接口。

【兼容处理】添加对event判断,根据浏览器的不同来得到正确的event:

function et()
{ 
evt=evt?evt:(window.event?window.event:null);
//兼容IE和Firefox
alert(evt);
}

2. 键盘值的取得

【分析说明】IE和Firefox获取键盘值的方法不同,可以理解,Firefox下的event.which与IE下的event.keyCode相当。关于彼此不同,可参考《键盘事件中keyCode、which和charCode 的兼容性测试》

【兼容处理】
复制代码

function myKeyPress(evt){
//兼容IE和Firefox获得keyBoardEvent对象
evt = (evt) ? evt : ((window.event) ? window.event : "")
//兼容IE和Firefox获得keyBoardEvent对象的键值
var key = evt.keyCode?evt.keyCode:evt.which;
if(evt.ctrlKey && (key == 13 || key == 10)){


//同时按下了Ctrl和回车键
//do something;
}
}

3. 事件源的获取

【分析说明】在使用事件委托的时候,通过事件源获取来判断事件到底来自哪个元素,但是,在IE下,event对象有srcElement属性,但是没有target属性;Firefox下,even对象有target属性,但是没有srcElement属性。

【兼容处理】

ele=function(evt){ //捕获当前事件作用的对象
evt=evt||window.event;
return

(obj=event.srcElement?event.srcElement:event.target;);
}

4. 事件监听

【分析说明】在事件监听处理方面,IE提供了attachEvent和detachEvent两个接口,而Firefox提供的是addEventListener和removeEventListener。

【兼容处理】最简单的兼容性处理就是封装这两套接口:

function addEvent(elem, eventName, handler) {
if (elem.attachEvent) {


elem.attachEvent("on" + eventName, function(){










handler.call(elem)});


//此处使用回调函数call(),让this指向elem

} else if (elem.addEventListener) {


elem.addEventListener(eventName, handler, false);

}
}
function removeEvent(elem, eventName, handler) {

if (elem.detachEvent) {


elem.detachEvent("on" + eventName, function(){










handler.call(elem)});


//此处使用回调函数call(),让this指向elem

} else if (elem.removeEventListener) {


elem.removeEventListener(eventName, handler, false);

}
}

需要特别注意,Firefox下,事件处理函数中的this指向被监听元素本身,而在IE下则不然,可使用回调函数call,让当前上下文指向监听的元素。

5. 鼠标位置

【分析说明】IE下,even对象有x,y属性,但是没有pageX,pageY属性;Firefox下,even对象有pageX,pageY属性,但是没有x,y属性。

【兼容处理】使用mX(mX = event.x ? event.x : event.pageX;)来代替IE下的event.x或者Firefox下的event.pageX。复杂点还要考虑绝对位置。

function getAbsPoint(e){
var x = e.offsetLeft, y = e.offsetTop;
while (e = e.offsetParent) {
x += e.offsetLeft;
y += e.offsetTop;
}
alert("x:" + x + "," + "y:" + y);
}
Javascript 相关文章推荐
JavaScript中令你抓狂的魔术变量
Nov 30 Javascript
jQuery验证插件validation使用指南
Apr 21 Javascript
JavaScript中利用Array和Object实现Map的方法
Jul 27 Javascript
Jqgrid之强大的表格插件应用
Dec 02 Javascript
jQuery插件实现表格隔行变色及鼠标滑过高亮显示效果代码
Feb 25 Javascript
Bootstrap每天必学之折叠(Collapse)插件
Apr 25 Javascript
vue.js的安装方法
May 12 Javascript
详解vue 数据传递的方法
Apr 19 Javascript
vue里面使用mui的弹出日期选择插件实例
Sep 16 Javascript
JS 正则表达式验证密码、邮箱格式的实例代码
Oct 28 Javascript
TypeScript类型声明书写详解
Aug 28 Javascript
JS实现前端动态分页码代码实例
Jun 02 Javascript
jQuery学习笔记之toArray()
Jun 09 #Javascript
jQuery学习笔记之jQuery原型属性和方法
Jun 09 #Javascript
jQuery简易图片放大特效示例代码
Jun 09 #Javascript
js操作模态窗口及父子窗口间相互传值示例
Jun 09 #Javascript
jQuery学习笔记之jQuery.extend(),jQuery.fn.extend()分析
Jun 09 #Javascript
js利用prototype调用Array的slice方法示例
Jun 09 #Javascript
jQuery学习笔记之jQuery.fn.init()的参数分析
Jun 09 #Javascript
You might like
php xml实例 留言本
2009/03/20 PHP
php中mysql模块部分功能的简单封装
2011/09/30 PHP
PHP三种方式实现链式操作详解
2017/01/21 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
2017/04/15 PHP
Yii框架实现对数据库的CURD操作示例
2019/09/03 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
2019/09/09 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
javascript实现单击和双击并存的方法
2014/12/13 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
2015/02/28 Javascript
jquery中添加属性和删除属性
2015/06/03 Javascript
Angular工具方法学习
2016/12/26 Javascript
AngularJS中$http的交互问题
2017/03/29 Javascript
js随机生成一个验证码
2017/06/01 Javascript
JavaScript实现计数器基础方法
2017/10/10 Javascript
JS动态插入脚本和插入引用外部链接脚本的方法
2018/05/21 Javascript
vue slot与传参实例代码讲解
2019/04/28 Javascript
基于Node.js的大文件分片上传示例
2019/06/19 Javascript
Vue登录主页动态背景短视频制作
2019/09/21 Javascript
vue计算属性+vue中class与style绑定(推荐)
2020/03/30 Javascript
Python实现的金山快盘的签到程序
2013/01/17 Python
Python对象的深拷贝和浅拷贝详解
2014/08/25 Python
Python数据类型学习笔记
2016/01/13 Python
Python中将字典转换为列表的方法
2016/09/21 Python
python中利用Future对象异步返回结果示例代码
2017/09/07 Python
python 3.6 +pyMysql 操作mysql数据库(实例讲解)
2017/12/20 Python
利用pyinstaller将py文件打包为exe的方法
2018/05/14 Python
python实现ID3决策树算法
2018/08/29 Python
Pytorch中Tensor与各种图像格式的相互转化详解
2019/12/26 Python
用python给csv里的数据排序的具体代码
2020/07/17 Python
PUMA澳大利亚官方网站:德国运动品牌
2018/10/19 全球购物
中西医专业毕业生职业规划书
2014/02/24 职场文书
2015年实习班主任工作总结
2015/04/23 职场文书
交通安全主题班会
2015/08/12 职场文书
PHP中多字节字符串操作实例详解
2021/08/23 PHP
分享一个vue实现的记事本功能案例
2022/04/11 Vue.js
Golang 入门 之url 包
2022/05/04 Golang