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 相关文章推荐
设为首页加入收藏兼容360/火狐/谷歌/IE等主流浏览器的代码
Mar 26 Javascript
在JS中如何调用JSP中的变量
Jan 22 Javascript
JavaScript返回网页中超链接数量的方法
Apr 03 Javascript
你所不了解的javascript操作DOM的细节知识点(一)
Jun 17 Javascript
JS对象深度克隆实例分析
Mar 16 Javascript
微信小程序实现添加手机联系人功能示例
Nov 30 Javascript
VueRouter导航守卫用法详解
Dec 25 Javascript
浅谈webpack组织模块的原理
Mar 10 Javascript
js 将线性数据转为树形的示例代码
May 28 Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
Sep 01 Javascript
js实现录音上传功能
Nov 22 Javascript
extjs图表绘制之条形图实现方法分析
Mar 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
全国FM电台频率大全 - 13 福建省
2020/03/11 无线电
追求程序速度,而不是编程的速度
2008/04/23 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
php无限级分类实现评论及回复功能
2019/02/18 PHP
JavaScript根据数据生成百分比图和柱状图的实例代码
2013/07/14 Javascript
JS调试必备的5个debug技巧
2014/03/07 Javascript
JS获取IMG图片高宽的简单实例
2016/05/17 Javascript
mvvm双向绑定机制的原理和实现代码(推荐)
2016/06/07 Javascript
Bootstrap复选框和单选按钮美化插件(推荐)
2016/11/23 Javascript
详解使用vue-router进行页面切换时滚动条位置与滚动监听事件
2017/03/08 Javascript
浅谈Vuex的状态管理(全家桶)
2017/11/04 Javascript
Vue全家桶实践项目总结(推荐)
2017/11/04 Javascript
js最简单的双向绑定实例讲解
2018/01/02 Javascript
Vue插件从封装到发布的完整步骤记录
2019/02/28 Javascript
JS工厂模式开发实践案例分析
2019/10/17 Javascript
iview实现图片上传功能
2020/06/29 Javascript
[11:33]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第二场
2018/04/06 DOTA
[07:09]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant 选手采访
2021/03/11 DOTA
Python时间模块datetime、time、calendar的使用方法
2016/01/13 Python
Python多线程爬虫简单示例
2016/03/04 Python
Python在不同目录下导入模块的实现方法
2017/10/27 Python
python实现决策树、随机森林的简单原理
2018/03/26 Python
PyQt5每天必学之创建窗口居中效果
2018/04/19 Python
Python之字典添加元素的几种方法
2020/09/30 Python
Python hashlib和hmac模块使用方法解析
2020/12/08 Python
Gibson London官网:以地道的英国男装而著称
2019/12/06 全球购物
文体活动总结范文
2014/05/05 职场文书
巾帼建功标兵事迹材料
2014/05/11 职场文书
市场营销专业应届生自荐信
2014/06/19 职场文书
公司的门卫岗位职责
2014/09/09 职场文书
顶岗实习计划书
2015/01/16 职场文书
学习雷锋精神活动总结
2015/02/06 职场文书
2015年四年级班主任工作总结
2015/10/22 职场文书
2016教师校本培训心得体会
2016/01/08 职场文书
如何起草一份正确的合伙创业协议书?
2019/07/04 职场文书
Go gRPC进阶教程gRPC转换HTTP
2022/06/16 Golang