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初学者需要了解10个小技巧
Aug 25 Javascript
JavaScript 继承使用分析
May 12 Javascript
jquery实现二级导航下拉菜单效果
Dec 18 Javascript
简单理解vue中el、template、replace元素
Oct 27 Javascript
浅谈Node.js:fs文件系统模块
Dec 08 Javascript
js的OOP继承实现(必看篇)
Feb 18 Javascript
微信小程序实现拖拽 image 触摸事件监听的实例
Aug 17 Javascript
mpvue+vant app搭建微信小程序的方法步骤
Feb 11 Javascript
Vue开发之封装分页组件与使用示例
Apr 25 Javascript
JS左右无缝轮播功能完整实例
May 16 Javascript
jquery获取并修改触发事件的DOM元素示例【基于target 属性】
Oct 10 jQuery
vue获取data数据改变前后的值方法
Nov 07 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
IIS6的PHP最佳配置方法
2007/03/19 PHP
php,ajax实现分页
2008/03/27 PHP
PHP中strlen()和mb_strlen()的区别浅析
2014/06/19 PHP
textContent在Firefox下与innerText等效的属性
2007/05/12 Javascript
jquery photoFrame 图片边框美化显示插件
2010/06/28 Javascript
入门基础学习 ExtJS笔记(一)
2010/11/11 Javascript
验证码在IE中不刷新而谷歌等浏览器正常的解决方案
2014/03/18 Javascript
Javascript玩转继承(一)
2014/05/08 Javascript
Javascript遍历Html Table示例(包括内容和属性值)
2014/07/08 Javascript
jquery合并表格中相同文本的相邻单元格
2015/07/17 Javascript
浅谈javascript的Touch事件
2015/09/27 Javascript
JS使用eval解析JSON的注意事项分析
2015/11/14 Javascript
每日十条JavaScript经验技巧(二)
2016/06/23 Javascript
详解Angular 自定义结构指令
2017/06/21 Javascript
浅谈vue引入css,less遇到的坑和解决方法
2018/01/20 Javascript
webpack4的迁移的使用方法
2018/05/25 Javascript
微信小程序制作表格的方法
2019/02/14 Javascript
javascript刷新父页面方法汇总详解
2019/10/10 Javascript
Vue axios 跨域请求无法带上cookie的解决
2020/09/08 Javascript
[03:27]最受玩家喜爱奖提名:PZH_Element 致玩家寄语
2016/12/20 DOTA
[50:59]2018DOTA2亚洲邀请赛 4.7 总决赛 LGD vs Mineski第四场
2018/04/10 DOTA
[48:30]LGD vs infamous Supermajor小组赛D组 BO3 第一场 6.3
2018/06/04 DOTA
用Python写冒泡排序代码
2016/04/12 Python
Python3用tkinter和PIL实现看图工具
2018/06/21 Python
Python多线程正确用法实例解析
2020/05/30 Python
带你学习Python如何实现回归树模型
2020/07/16 Python
Python模拟键盘输入自动登录TGP
2020/11/27 Python
python中zip()函数遍历多个列表方法
2021/02/18 Python
HTML5 video循环播放多个视频的方法步骤
2020/08/06 HTML / CSS
阿根廷网上配眼镜:SmartBuyGlasses阿根廷
2016/08/19 全球购物
九州传奇上机题
2014/07/10 面试题
投资合作协议书
2014/04/17 职场文书
农业开发项目建议书
2014/05/16 职场文书
暑假安全保证书
2015/02/28 职场文书
工作年限证明模板
2015/06/15 职场文书
2016新年问候语大全
2015/11/11 职场文书