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 相关文章推荐
js 日期转换成中文格式的函数
Jul 07 Javascript
js调用activeX获取u盘序列号的代码
Nov 21 Javascript
jquery ajax例子返回值详解
Sep 11 Javascript
JS实现的生成随机数的4个函数分享
Feb 11 Javascript
JS实现拖动滚动条评分的效果代码分享
Sep 29 Javascript
JS实现购物车特效
Feb 02 Javascript
jquery实现轮播图效果
Feb 13 Javascript
jQuery 1.9版本以上的浏览器判断方法代码分享
Aug 28 jQuery
在Vue.js中使用Mixins的方法
Sep 12 Javascript
浅析Vue自定义组件的v-model
Nov 26 Javascript
如何解决webpack-dev-server代理常切换问题
Jan 09 Javascript
js实现头像上传并且可预览提交
Dec 25 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实现zip压缩文件解压缩代码分享(简单易懂)
2014/05/10 PHP
php绘制一条直线的方法
2015/01/24 PHP
详解PHP的Yii框架中的Controller控制器
2016/03/29 PHP
PHP命令Command模式用法实例分析
2018/08/08 PHP
JS实现浏览器状态栏文字从右向左弹出效果代码
2015/10/27 Javascript
jQuery 常用代码集锦(必看篇)
2016/05/16 Javascript
PHP抓取HTTPS内容和错误处理的方法
2016/09/30 Javascript
微信小程序 动态传参实例详解
2017/04/27 Javascript
react-router-dom 嵌套路由的实现
2020/05/02 Javascript
Openlayers显示地理位置坐标的方法
2020/09/28 Javascript
vue watch监控对象的简单方法示例
2021/01/07 Vue.js
[43:32]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第一场
2014/05/26 DOTA
[44:58]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第二场
2018/04/06 DOTA
python中遍历文件的3个方法
2014/09/02 Python
python使用arp欺骗伪造网关的方法
2015/04/24 Python
Python list操作用法总结
2015/11/10 Python
利用python操作SQLite数据库及文件操作详解
2017/09/22 Python
python实现图像识别功能
2018/01/29 Python
详解Python 调用C# dll库最简方法
2019/06/20 Python
python模拟鼠标点击和键盘输入的操作
2019/08/04 Python
Python字符串格式化输出代码实例
2019/11/22 Python
jupyter notebook 实现matplotlib图动态刷新
2020/04/22 Python
解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题
2020/07/14 Python
python使用列表的最佳方案
2020/08/12 Python
python 利用toapi库自动生成api
2020/10/19 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
2020/11/02 Python
货物运输服务质量承诺书
2014/05/29 职场文书
2014年党的群众路线整改措施思想汇报
2014/10/12 职场文书
银行党员批评与自我批评
2014/10/15 职场文书
2014年教研工作总结
2014/12/06 职场文书
酒店收银员岗位职责
2015/04/07 职场文书
企业爱心捐款倡议书
2015/04/27 职场文书
伊索寓言读书笔记
2015/06/30 职场文书
2015年国庆节演讲稿范文
2015/07/30 职场文书
MySQL 时间类型的选择
2021/06/05 MySQL
纯CSS打字动画的实现示例
2022/08/05 HTML / CSS