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 相关文章推荐
如何让DIV可编辑、可拖动示例代码
Sep 18 Javascript
window resize和scroll事件的基本优化思路
Apr 29 Javascript
jQuery中的基本选择器用法学习教程
Apr 14 Javascript
详解jQuery UI库中文本输入自动补全功能的用法
Apr 23 Javascript
jQuery Password Validation密码验证
Dec 30 Javascript
jQuery实现Select下拉列表进行状态选择功能
Mar 30 jQuery
JS原生带小白点轮播图实例讲解
Jul 22 Javascript
React.Js添加与删除onScroll事件的方法详解
Nov 03 Javascript
详解微信小程序-扫一扫 wx.scanCode() 扫码大变身
Apr 30 Javascript
layui select 禁止点击的实现方法
Sep 05 Javascript
JS call()及apply()方法使用实例汇总
Jul 11 Javascript
JS面向对象实现飞机大战
Aug 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
谈谈PHP语法(3)
2006/10/09 PHP
在WIN98下以apache模块方式安装php
2006/10/09 PHP
html下载本地
2006/06/19 Javascript
jQuery 技巧小结
2010/04/02 Javascript
基于jquery的获取浏览器窗口大小的代码
2011/03/28 Javascript
两个select多选模式的选项相互移动(示例代码)
2014/01/11 Javascript
jQuery中;function($,undefined) 前面的分号的用处
2014/12/17 Javascript
js获取当前日期时间及其它操作汇总
2015/04/17 Javascript
javascript实现的多个层切换效果通用函数实例
2015/07/06 Javascript
js实现时间轴自动排列效果
2017/03/09 Javascript
实现两个文本框同时输入的实例
2017/09/25 Javascript
JS实现table表格内针对某列内容进行即时搜索筛选功能
2018/05/11 Javascript
讲解vue-router之什么是动态路由
2018/05/28 Javascript
详解基于Node.js的HTTP/2 Server实践
2018/05/31 Javascript
vuejs选中当前样式active的实例
2018/08/22 Javascript
使用vue-cli3新建一个项目并写好基本配置(推荐)
2019/04/24 Javascript
详解Vue前端生产环境发布配置实战篇
2019/05/07 Javascript
自定义Vue组件打包、发布到npm及使用教程
2019/05/22 Javascript
Vue.js数字输入框组件使用方法详解
2019/10/19 Javascript
[56:45]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第一局
2016/02/28 DOTA
Python 的 Socket 编程
2015/03/24 Python
Python字符串拼接六种方法介绍
2017/12/18 Python
python tkinter图形界面代码统计工具(更新)
2019/09/18 Python
Python 简单计算要求形状面积的实例
2020/01/18 Python
在django中使用post方法时,需要增加csrftoken的例子
2020/03/13 Python
浅谈Python 命令行参数argparse写入图片路径操作
2020/07/12 Python
质检部职责
2013/12/28 职场文书
岗位廉洁从政承诺书
2014/03/27 职场文书
终止合同协议书
2014/04/17 职场文书
团队激励口号
2014/06/06 职场文书
杭州黄龙洞导游词
2015/02/10 职场文书
篮球赛闭幕式主持词
2015/07/03 职场文书
活动简报范文
2015/07/22 职场文书
结婚主持人致辞
2015/07/28 职场文书
Java使用httpRequest+Jsoup爬取红蓝球号码
2021/07/02 Java/Android
mysql 体系结构和存储引擎介绍
2022/05/06 MySQL