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的语言特性分析
Apr 11 Javascript
使用JavaScript 实现各种跨域的方法
May 08 Javascript
js文件缓存之版本管理详解
Jul 05 Javascript
js 获取radio按钮值的实例
Aug 17 Javascript
jquery ajax跨域解决方法(json方式)
Feb 04 Javascript
window.location.reload 刷新使用分析(去对话框)
Nov 11 Javascript
AngularJS中的$watch(),$digest()和$apply()区分
Apr 04 Javascript
angular实现表单验证及提交功能
Feb 01 Javascript
JS解析url查询参数的简单代码
Aug 06 Javascript
AngularJS实现注册表单验证功能
Oct 16 Javascript
浅谈Webpack核心模块tapable解析
Sep 11 Javascript
react高阶组件添加和删除props
Apr 26 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
PHP5.5和之前的版本empty函数的不同之处
2014/06/13 PHP
PHP使用CURL模拟登录的方法
2015/07/08 PHP
强制设为首页代码
2006/06/19 Javascript
Mootools 1.2教程 同时进行多个形变动画
2009/09/15 Javascript
javascript,jquery闭包概念分析
2010/06/19 Javascript
关于javascript DOM事件模型的两件事
2010/07/22 Javascript
有趣的JavaScript数组长度问题代码说明
2011/01/20 Javascript
基于jQuery的动态表格插件
2011/03/28 Javascript
让textarea自动调整大小的js代码
2011/04/12 Javascript
js不能跳转到上一页面的问题解决方法
2013/03/01 Javascript
jquery中的查找parents与closest方法之间的区别
2013/12/02 Javascript
分享JavaScript获取网页关闭与取消关闭的事件
2013/12/13 Javascript
js点击button按钮跳转到另一个新页面
2014/10/10 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
javascript实现获取服务器时间
2015/05/19 Javascript
jQuery实现复选框批量选择与反选的方法
2015/06/17 Javascript
谈一谈jQuery核心架构设计
2016/03/28 Javascript
Ionic + Angular.js实现验证码倒计时功能的方法
2017/06/12 Javascript
angular4中关于表单的校验示例
2017/10/16 Javascript
JavaScript引用类型RegExp基本用法详解
2018/08/09 Javascript
对vue2.0中.vue文件页面跳转之.$router.push的用法详解
2018/08/24 Javascript
Vue CLI 2.x搭建vue(目录最全分析)
2019/02/27 Javascript
微信小程序开发之点击按钮退出小程序的实现方法
2019/04/26 Javascript
JS数组的高级使用方法示例小结
2020/03/14 Javascript
nestjs中异常过滤器Exceptionfilter的具体使用
2021/02/07 Javascript
Python中optionParser模块的使用方法实例教程
2014/08/29 Python
python3实现SMTP发送邮件详细教程
2018/06/19 Python
纯CSS3实现的井字棋游戏
2020/11/25 HTML / CSS
突袭HTML5之Javascript API扩展5—其他扩展(应用缓存/服务端消息/桌面通知)
2013/01/31 HTML / CSS
优秀党员获奖感言
2014/02/18 职场文书
十佳文明家庭事迹
2014/05/25 职场文书
五好关工委申报材料
2014/05/31 职场文书
数学兴趣小组活动总结
2014/07/08 职场文书
2016年庆“七一”主题党日活动总结
2016/04/05 职场文书
《游戏王:大师决斗》将推出新卡牌包4月4日上线
2022/03/31 其他游戏
Python OpenCV形态学运算示例详解
2022/04/07 Python