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 相关文章推荐
jquery中:input和input的区别分析
Jul 13 Javascript
jQuery实现div拖拽效果实例分析
Feb 20 Javascript
jquery获取复选框checkbox的值的简单实现方法
May 26 Javascript
IE8兼容Jquery.validate.js的问题
Dec 01 Javascript
浅谈ECMAScript6新特性之let、const
Aug 02 Javascript
React中常见的动画实现的几种方式
Jan 10 Javascript
解决vue的变量在settimeout内部效果失效的问题
Aug 30 Javascript
JavaScript 性能提升之路(推荐)
Apr 10 Javascript
Vue $mount实战之实现消息弹窗组件
Apr 22 Javascript
JS函数进阶之prototy用法实例分析
Jan 15 Javascript
JS中==、===你分清楚了吗
Mar 04 Javascript
vue中全局路由守卫中替代this操作(this.$store/this.$vux)
Jul 24 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代码包装修正版
2008/03/15 PHP
解析php中memcache的应用
2013/06/18 PHP
php object转数组示例
2014/01/15 PHP
php基于session实现数据库交互的类实例
2015/08/03 PHP
php实现XML和数组的相互转化功能示例
2017/02/08 PHP
PHP创建XML接口示例
2019/07/04 PHP
prototype 1.5相关知识及他人笔记
2006/12/16 Javascript
javascript中比较字符串是否相等的方法
2013/07/23 Javascript
原生JS操作网页给p元素添加onclick事件及表格隔行变色
2013/12/01 Javascript
JS获取及设置TextArea或input文本框选择文本位置的方法
2015/03/24 Javascript
Bootstrap每天必学之按钮(Button)插件
2016/04/25 Javascript
js原生代码实现轮播图的实例讲解
2017/07/28 Javascript
DVA框架统一处理所有页面的loading状态
2017/08/25 Javascript
vue监听对象及对象属性问题
2018/08/20 Javascript
深入讲解Python中面向对象编程的相关知识
2015/05/25 Python
Python的Django REST框架中的序列化及请求和返回
2016/04/11 Python
Pycharm技巧之代码跳转该如何回退
2017/07/16 Python
简单实现python进度条脚本
2017/12/18 Python
解决Python下imread,imwrite不支持中文的问题
2018/12/05 Python
python整小时 整天时间戳获取算法示例
2019/02/20 Python
在Python中append以及extend返回None的例子
2019/07/20 Python
python实现复制大量文件功能
2019/08/31 Python
python循环输出三角形图案的例子
2019/11/22 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
django 取消csrf限制的实例
2020/03/13 Python
在HTML5中如何使用CSS建立不可选的文字
2014/10/17 HTML / CSS
伦敦所有西区剧院演出官方票务代理:Theatre Tickets Direct
2017/05/26 全球购物
Abbacino官网:包、钱包和女士配饰
2019/04/15 全球购物
面向对象编程OOP的优点
2013/01/22 面试题
什么是makefile? 如何编写makefile?
2013/01/02 面试题
JS原生实现轮播图的几种方法
2021/03/23 Javascript
高中英语教学反思
2014/02/04 职场文书
总裁助理岗位职责
2014/02/17 职场文书
感恩的演讲稿
2014/05/06 职场文书
2019暑期安全倡议书!
2019/06/27 职场文书
导游词之吉林花园山
2019/10/17 职场文书