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可突破windows弹退效果代码
Aug 09 Javascript
用tip解决Ext列宽度不够的问题
Dec 13 Javascript
基于Jquery的表格隔行换色,移动换色,点击换色插件
Dec 22 Javascript
javascript数组去重3种方法的性能测试与比较
Mar 26 Javascript
深入解读JavaScript中的Iterator和for-of循环
Jul 28 Javascript
smartcrop.js智能图片裁剪库
Oct 14 Javascript
总结Javascript中的隐式类型转换
Aug 24 Javascript
AngularJs bootstrap详解及示例代码
Sep 01 Javascript
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
Dec 07 Javascript
vuex actions传递多参数的处理方法
Sep 18 Javascript
详解node登录接口之密码错误限制次数(含代码)
Oct 25 Javascript
解决vue中axios设置超时(超过5分钟)没反应的问题
Sep 04 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
在PHP3中实现SESSION的功能(二)
2006/10/09 PHP
PHP嵌套输出缓冲代码实例
2015/05/12 PHP
PHP静态成员变量和非静态成员变量详解
2017/02/14 PHP
解决laravel id非自增 模型取回为0 的问题
2019/10/11 PHP
DWR Ext 加载数据
2009/03/22 Javascript
javascript 放大镜 v1.0 基于Yui2 实现的放大镜效果
2010/03/08 Javascript
javascript实现的弹出层背景置灰-模拟(easyui dialog)
2013/12/27 Javascript
jquery的trigger和triggerHandler的区别示例介绍
2014/04/20 Javascript
Extjs 点击复选框在表格中增加相关信息行
2016/07/12 Javascript
微信小程序链接传参并跳转新页面
2016/11/29 Javascript
JS简单实现表格排序功能示例
2016/12/20 Javascript
vue实现选项卡及选项卡切换效果
2018/04/24 Javascript
使用vue-cli webpack 快速搭建项目的代码
2018/11/21 Javascript
taro开发微信小程序的实践
2019/05/21 Javascript
Vue.js仿Select下拉框效果
2020/02/18 Javascript
手把手带你入门微信小程序新框架Kbone的使用
2020/02/25 Javascript
《javascript设计模式》学习笔记四:Javascript面向对象程序设计链式调用实例分析
2020/04/07 Javascript
[01:05:24]Ti4 冒泡赛第二天 iG vs NEWBEE 3
2014/07/15 DOTA
基于Django模板中的数字自增(详解)
2017/09/05 Python
Python实现的插入排序算法原理与用法实例分析
2017/11/22 Python
python中的不可变数据类型与可变数据类型详解
2018/09/16 Python
python 内置模块详解
2019/01/01 Python
python基于SMTP协议发送邮件
2019/05/31 Python
python 反编译exe文件为py文件的实例代码
2019/06/27 Python
对python中GUI,Label和Button的实例详解
2019/06/27 Python
Django框架安装方法图文详解
2019/11/04 Python
python mysql 字段与关键字冲突的解决方式
2020/03/02 Python
美国最好的钓鱼、狩猎和划船装备商店:Bass Pro Shops
2018/12/02 全球购物
Notino法国:购买香水和化妆品
2019/04/15 全球购物
美国鲜花递送:UrbanStems
2021/01/04 全球购物
企业管理部经理岗位职责
2013/12/24 职场文书
街道党风廉政建设调研报告
2015/01/01 职场文书
银行先进个人总结
2015/02/15 职场文书
停课通知书
2015/04/24 职场文书
部门2015年度工作总结
2015/04/29 职场文书
CSS 实现Chrome标签栏的技巧
2021/08/04 HTML / CSS