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 15 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
Sep 03 Javascript
javascript字符串循环匹配实例分析
Jul 17 Javascript
JavaScript实现通过select标签跳转网页的方法
Sep 29 Javascript
表单元素值获取方式js及java方式的简单实例
Oct 15 Javascript
JS简单实现移动端日历功能示例
Dec 28 Javascript
微信小程序通过api接口将json数据展现到小程序示例
Jan 20 Javascript
bootstrap table操作技巧分享
Feb 15 Javascript
基于js的变量提升和函数提升(详解)
Sep 17 Javascript
使用Electron构建React+Webpack桌面应用的方法
Dec 15 Javascript
《javascript少儿编程》location术语总结
May 27 Javascript
Vue使用lodop实现打印小结
Jul 06 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 curl常见错误:SSL错误、bool(false)
2011/12/28 PHP
Yii使用find findAll查找出指定字段的实现方法
2014/09/05 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
2014/12/19 PHP
分享一则PHP定义函数代码
2015/02/26 PHP
php实现表单多按钮提交action的处理方法
2015/10/24 PHP
php正则表达式验证(邮件地址、Url地址、电话号码、邮政编码)
2016/03/14 PHP
PHP实现财务审核通过后返现金额到客户的功能
2019/07/04 PHP
通过代码实例解析PHP session工作原理
2020/12/11 PHP
再谈javascript图片预加载技术(详细演示)
2011/03/12 Javascript
JS实现超精简响应鼠标显示二级菜单代码
2015/09/12 Javascript
canvas的神奇用法
2017/02/03 Javascript
BootStrap中的Fontawesome 图标
2017/05/25 Javascript
jQuery实现用户信息表格的添加和删除功能
2017/09/12 jQuery
Vue2仿淘宝实现省市区三级联动
2020/04/15 Javascript
详解Angular系列之变化检测(Change Detection)
2018/02/26 Javascript
js神秘的电报密码 哈弗曼编码实现
2019/09/10 Javascript
ionic+html5+API实现双击返回键退出应用
2019/09/17 Javascript
Node.js创建一个Express服务的方法详解
2020/01/06 Javascript
vue实现简易图片左右旋转,上一张,下一张组件案例
2020/07/31 Javascript
python检测服务器是否正常
2014/02/16 Python
详解Python中列表和元祖的使用方法
2015/04/25 Python
基于python log取对数详解
2018/06/08 Python
Python3使用turtle绘制超立方体图形示例
2018/06/19 Python
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
2019/01/23 Python
Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)
2020/06/23 Python
Python函数__new__及__init__作用及区别解析
2020/08/31 Python
python如何停止递归
2020/09/09 Python
Linux上比较文件的命令都有哪些
2013/09/28 面试题
夜大毕业生自我鉴定
2013/10/31 职场文书
编辑找工作求职信范文
2013/12/16 职场文书
万能检讨书
2015/01/27 职场文书
党员违纪检讨书
2015/05/05 职场文书
golang中的空slice案例
2021/04/27 Golang
解析python中的jsonpath 提取器
2022/01/18 Python
《现实主义勇者的王国再建记》第三弹OST全曲试听片段公开
2022/04/04 日漫