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 相关文章推荐
让网页根据不同IE版本显示不同的内容
Feb 08 Javascript
Javascript学习笔记 delete运算符
Sep 13 Javascript
JavaScript window.document的属性、方法和事件小结
Oct 24 Javascript
jQuery父级以及同级元素查找介绍
Sep 04 Javascript
js中的事件捕捉模型与冒泡模型实例分析
Jan 10 Javascript
js图片跟随鼠标移动代码
Nov 26 Javascript
javascript关于继承解析
May 10 Javascript
JavaScript函数节流和函数防抖之间的区别
Feb 15 Javascript
js中的面向对象入门
Mar 06 Javascript
解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题
Aug 03 Javascript
详解搭建一个vue-cli的移动端H5开发模板
Jan 17 Javascript
JS浏览器BOM常见操作实例详解
Apr 27 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相关资料
2006/10/09 PHP
第4章 数据处理-php数组的处理-郑阿奇
2011/07/04 PHP
PHP数组实例总结与说明
2011/08/23 PHP
thinkphp jquery实现图片上传和预览效果
2020/07/22 PHP
让textarea自动调整大小的js代码
2011/04/12 Javascript
JQuery验证工具类搜集整理
2013/01/16 Javascript
JavaScript中使用Object.prototype.toString判断是否为数组
2015/04/01 Javascript
纯js实现瀑布流布局及ajax动态新增数据
2016/04/07 Javascript
分享两段简单的JS代码防止SQL注入
2016/04/12 Javascript
javascript中获取class的简单实现
2016/07/12 Javascript
在 Angular 中实现搜索关键字高亮示例
2017/03/21 Javascript
基于angular-utils-ui-breadcrumbs使用心得(分享)
2017/11/03 Javascript
jQuery简单实现的HTML页面文本框模糊匹配查询功能完整示例
2018/05/09 jQuery
使用JS代码实现俄罗斯方块游戏
2018/08/03 Javascript
webpack打包nodejs项目的方法
2018/09/26 NodeJs
Vue使用localStorage存储数据的方法
2019/05/27 Javascript
js中关于Blob对象的介绍与使用
2019/11/29 Javascript
在antd中setFieldsValue和defaultVal的用法
2020/10/29 Javascript
[40:03]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#1EHOME VS Archon
2016/03/02 DOTA
Python实现数据库编程方法详解
2015/06/09 Python
python 将字符串转换成字典dict的各种方式总结
2018/03/23 Python
《与孩子一起学编程》python自测题
2018/05/27 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
2019/07/01 Python
Python 进程之间共享数据(全局变量)的方法
2019/07/16 Python
python提取xml里面的链接源码详解
2019/10/15 Python
化学学院毕业生自荐信范文
2013/12/17 职场文书
新员工入职感言
2014/02/01 职场文书
学习十八大报告感言
2014/02/28 职场文书
大学生全国两会报告感想
2014/03/17 职场文书
毕业评语大全
2014/05/04 职场文书
学习之星事迹材料
2014/05/17 职场文书
霸气队列口号
2014/06/18 职场文书
网络销售员岗位职责
2015/04/11 职场文书
职场新人知识:如何制定一份合理的工作计划?
2019/09/11 职场文书
Java 多态分析
2022/04/26 Java/Android
Spring Cloud OAuth2实现自定义token返回格式
2022/06/25 Java/Android