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 相关文章推荐
juqery 学习之四 筛选过滤
Nov 30 Javascript
如何使用JS获取IE上传文件路径(IE7,8)
Jul 08 Javascript
jQuery中:not选择器用法实例
Dec 30 Javascript
RequireJS入门一之实现第一个例子
Sep 30 Javascript
基于javascript制作微博发布栏效果
Apr 04 Javascript
JavaScript和jquery获取父级元素、子级元素、兄弟元素的方法
Jun 05 Javascript
jQuery+ajax实现实用的点赞插件代码
Jul 06 Javascript
Bootstrap对话框使用实例讲解
Sep 24 Javascript
详解Vue使用 vue-cli 搭建项目
Apr 20 Javascript
slideToggle+slideup实现手机端折叠菜单效果
May 25 Javascript
Vue的土著指令和自定义指令实例详解
Feb 04 Javascript
vscode中eslint插件的配置(prettier配置无效)
Sep 10 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语法(2)
2006/10/09 PHP
mysql 中InnoDB和MyISAM的区别分析小结
2008/04/15 PHP
简单示例AJAX结合PHP代码实现登录效果代码
2008/07/25 PHP
PHP实现数组array转换成xml的方法
2016/07/19 PHP
js用正则表达式来验证表单(比较齐全的资源)
2013/11/17 Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
2014/12/12 Javascript
基于jquery实现全屏滚动效果
2015/11/26 Javascript
Javascript中for循环语句的几种写法总结对比
2017/01/23 Javascript
AngularJS constant和value区别详解
2017/02/28 Javascript
Vue自定义指令使用方法详解
2017/08/21 Javascript
基于vue2实现左滑删除功能
2017/11/28 Javascript
JavaScript中0、空字符串、'0'是true还是false的知识点分享
2019/09/16 Javascript
js canvas实现星空连线背景特效
2019/11/01 Javascript
javascript利用键盘控制小方块的移动
2020/04/20 Javascript
详解Python2.x中对Unicode编码的使用
2015/04/03 Python
基于并发服务器几种实现方法(总结)
2017/12/29 Python
详解python中的json和字典dict
2018/06/22 Python
pycharm安装和首次使用教程
2018/08/27 Python
Django实现文件上传下载功能
2019/10/06 Python
关于html字符串正则判断和匹配的具体使用
2019/12/12 HTML / CSS
艺术用品:Arteza
2018/11/25 全球购物
美国球迷装备的第一来源:FOCO
2020/07/03 全球购物
国家励志奖学金获奖感言
2014/01/09 职场文书
上班早退检讨书
2014/01/09 职场文书
总经理文秘岗位职责
2014/02/03 职场文书
信息技术教学反思
2014/02/12 职场文书
船舶工程技术专业求职信
2014/08/07 职场文书
中学生运动会新闻稿
2014/09/24 职场文书
村主任“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
三八妇女节标语
2014/10/09 职场文书
2014年财务工作总结范文
2014/11/11 职场文书
主持人开场白台词
2015/05/29 职场文书
七年级作文之英语老师
2019/10/28 职场文书
教你怎么用PyCharm为同一服务器配置多个python解释器
2021/05/31 Python
Python利用zhdate模块实现农历日期处理
2022/03/31 Python
mysql函数之截取字符串的实现
2022/08/14 MySQL