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 相关文章推荐
收藏一些不常用,但是有用的代码
Mar 12 Javascript
JS实现简易图片轮播效果的方法
Mar 25 Javascript
js使用onmousemove和onmouseout获取鼠标坐标的方法
Mar 31 Javascript
jQuery+css实现的tab切换标签(兼容各浏览器)
Jan 28 Javascript
javascript 数组的定义和数组的长度
Jun 07 Javascript
jQuery仿IOS弹出框插件
Feb 18 Javascript
JS获取一个表单字段中多条数据并转化为json格式
Oct 17 Javascript
VUE+Element UI实现简单的表格行内编辑效果的示例的代码
Oct 31 Javascript
jQuery+vue.js实现的多选下拉列表功能示例
Jan 15 jQuery
vue配置文件实现代理v2版本的方法
Jun 21 Javascript
JavaScript实现图片轮播特效
Oct 23 Javascript
canvas绘制折线路径动画实现
May 12 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 autoload机制的详解
2013/06/09 PHP
PHP获取文件的MD5值并判断是否被修改的例子
2014/06/19 PHP
PHP中的类型约束介绍
2015/05/11 PHP
php中preg_replace_callback函数简单用法示例
2016/07/21 PHP
根据出生日期自动取得星座的js代码
2010/07/20 Javascript
拥抱模块化的JavaScript
2012/03/07 Javascript
利用jQuery的deferred对象实现异步按顺序加载JS文件
2013/03/17 Javascript
jquery对象和DOM对象的区别介绍
2013/08/09 Javascript
js实现图片和链接文字同步切换特效的方法
2015/02/20 Javascript
jQuery超精致图片轮播幻灯片特效代码分享
2015/09/10 Javascript
基于jQuery实现动态搜索显示功能
2016/05/05 Javascript
jQuery中的ready函数与window.onload谁先执行
2016/06/21 Javascript
JS实现异步上传压缩图片
2017/04/22 Javascript
javascript基于牛顿迭代法实现求浮点数的平方根【递归原理】
2017/09/28 Javascript
基于vue-video-player自定义播放器的方法
2018/03/21 Javascript
微信小程序实现商城倒计时
2020/11/01 Javascript
利用不到200行代码写一款属于你自己的js类库
2019/07/08 Javascript
javascript面向对象程序设计实践常用知识点总结
2019/07/29 Javascript
[02:33]2018 DOTA2亚洲邀请赛回顾视频 再次拾起那些美妙的时刻
2018/04/10 DOTA
python append、extend与insert的区别
2016/10/13 Python
在python下读取并展示raw格式的图片实例
2019/01/24 Python
Python队列RabbitMQ 使用方法实例记录
2019/08/05 Python
Python 实用技巧之利用Shell通配符做字符串匹配
2019/08/23 Python
python 调试冷知识(小结)
2019/11/11 Python
PyQt5实现简单的计算器
2020/05/30 Python
Numpy实现卷积神经网络(CNN)的示例
2020/10/09 Python
使用python-cv2实现Harr+Adaboost人脸识别的示例
2020/10/27 Python
纽约JewelryAffairs珠宝店:精细金银时尚首饰
2017/02/05 全球购物
什么是跨站脚本攻击
2014/12/11 面试题
vue+django实现下载文件的示例
2021/03/24 Vue.js
微观物理专业自荐信
2014/01/26 职场文书
《值日生》教学反思
2014/02/17 职场文书
爱护公共设施标语
2014/06/24 职场文书
2015年社区居委会工作总结
2015/05/18 职场文书
如何让vue长列表快速加载
2021/03/29 Vue.js
CentOS安装Nginx并部署vue
2022/04/12 Servers