IE和Firefox下event事件杂谈


Posted in Javascript onDecember 18, 2009

因为javascript的事件模型有三种,它们分别是NN4、IE4+和W3C/Safari;这也造成了在不同的浏览器中处理event的差异,这里结合一些零碎的代码来说明如何做到event在IE4+和Firefox下的正常工作。
首先看如下代码:

function doEventThing(eventTag){ 
var event = eventTag||window.event; 
var currentKey = event.charCode||event.keyCode; 
var eventSource =window.event.srcElement||eventTag.target; 
}

这段代码主要是为了处理键盘事件的,在IE中event作为window对象的一个属性可以直接使用,但是在Firefox中却使用了W3C的模型,它是通过传参的方法来传播事件的,也就是说你需要为你的函数提供一个事件响应的接口,在上述函数中,
eventTag扮演的就是这个角色。

var event = eventTag||window.event;

这段代码可以根据浏览器的不同来得到正确的event,并在程序中使用,如果在IE4+下面使用这段代码,因为eventTag为null可以保证event = window.event,但是如果在Firefox下运行的话则因为手工的给定了eventTag所以var event = eventTag。根据对这一段代码的分析我们也不难看出可以对doEventThing方法进行如下的改造(因为javascript允许我们在定义function的时候不明确指出参数的数量):

function doEventThing(){ 
var event = arguments[0]||window.event; 
//other code 
}

在Firefox下arguments[0]在特定的场合(没有显式的指定function参数数量的时候)被做为传播事件的参数来使用…………

至于var currentKey = event.charCode||event.keyCode;也是不同的浏览器所致,在IE4+下面记录键盘的是keyCode,但是在Firefox下的却是charCode,为此我们需要处理他们的差异。

还有一个差异就是事件源的获取:通过语句

var eventSource = window.event.srcElement||eventTag.target;

我们也看到了IE与W3C的不同。

经过上面的包装,我们基本上可以在IE4+和Firefox下面顺利的使用事件机制了,当然如果为了通用性可以对这种差异进封装来形成自己的Event对象在程序中误差别的使用事件对象,这里就不在介绍了。

接下来分析事件的绑定:大概分为如下5种

1、绑定到元素,这也是比较常见的一种比如:

<input type="button" onclick="doEventThing(event)">
,这样我们就把doEventThing绑定到了该button对象上,点击此按钮事件就被触发。

2、绑定事件到对象:这也是比较常见的一种,特别是在IE4+下面:

document.getElementById("divid").onclick = doEventThing;

3、使用<script for>进行事件的绑定,这只在IE4+下有用(为buttong1绑定事件,逻辑在script块中书写event来指定怎么触发事件):

<script event="onclick" for="button1">
 // script statements here
</script>

4、使用 IE5/Windows 的 attachEvent() 方法
5、使用 W3C DOM 的 addEventListener() 方法

addEventListener("eventType",listenerReference,captureFlag);

第三个参数则是一个 Boolean 值,指明该结点是否以DOM中所谓的捕捉模式来侦听事件。对于一个典型的事件侦听器来说,第三个参数应该为false(假)。

prototype在绑定事件的时候兼容IE和W3C的时候做的处理如下:

_observeAndCache: function(element, name, observer, useCapture) { 
if (!this.observers) this.observers = []; 
if (element.addEventListener) {//W3C DOM 
this.observers.push([element, name, observer, useCapture]); 
element.addEventListener(name, observer, useCapture); 
} else if (element.attachEvent) {//IE5/Windows 
this.observers.push([element, name, observer, useCapture]); 
element.attachEvent('on' + name, observer); 
} 
}

撇开this.observers.pust([element,name,observer,useCapture])不谈,我们对4、5所说的事件绑定就很清楚了。我们知道prototype的此方法的useCapture在IE下没有作用,只对W3C的事件处理机制起作用。
Javascript 相关文章推荐
在网页中控制wmplayer播放器
Jul 01 Javascript
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
Feb 03 Javascript
javascript parseInt() 函数的进制转换注意细节
Jan 08 Javascript
JS 跳转页面延迟2种方法
Mar 29 Javascript
JS 毫秒转时间示例代码
Sep 22 Javascript
比较新旧两个数组值得增加和删除的JS代码
Oct 30 Javascript
javascript中callee与caller的区别分析
Apr 20 Javascript
jQuery实现页面内锚点平滑跳转特效的方法总结
May 11 Javascript
JavaScript判断按钮被点击的方法
Dec 13 Javascript
深入理解javascript的getTime()方法
Feb 16 Javascript
js实现ATM机存取款功能
Oct 27 Javascript
webpack proxy 使用(代理的使用)
Jan 10 Javascript
替代window.event.srcElement效果的可兼容性的函数
Dec 18 #Javascript
JavaScript 序列化对象实现代码
Dec 18 #Javascript
让div层随鼠标移动的实现代码 ie ff
Dec 18 #Javascript
Javascript在IE或Firefox下获取鼠标位置的代码
Dec 18 #Javascript
javascript 导出数据到Excel(处理table中的元素)
Dec 18 #Javascript
event.srcElement 用法笔记e.target
Dec 18 #Javascript
Javascript document.referrer判断访客来源网址
May 15 #Javascript
You might like
深入解析php中的foreach函数
2013/08/31 PHP
php实现比较两个字符串日期大小的方法
2015/05/12 PHP
PHP关联数组实现根据元素值删除元素的方法
2015/06/26 PHP
php连接微软MSSQL(sql server)完全攻略
2016/11/27 PHP
PHP用continue跳过本次循环中剩余代码的注意点
2017/06/27 PHP
PHP中的Iterator迭代对象属性详解
2019/04/12 PHP
Laravel手动返回错误码示例
2019/10/22 PHP
nicejforms——美化表单不用愁
2007/02/20 Javascript
JavaScript中null与undefined分析
2009/07/25 Javascript
深入理解JavaScript系列(4) 立即调用的函数表达式
2012/01/15 Javascript
JS获取几种URL地址的方法小结
2014/02/26 Javascript
jquery实现鼠标滑过小图时显示大图的方法
2015/01/14 Javascript
浅析BootStrap栅格系统
2016/06/07 Javascript
JavaScript中数据类型转换总结
2016/12/25 Javascript
微信小程序实现轮播图效果
2017/09/07 Javascript
微信小程序实现打卡日历功能
2020/09/21 Javascript
在Web关闭页面时发送Ajax请求的实现方法
2019/03/07 Javascript
javascript设计模式 ? 访问者模式原理与用法实例分析
2020/04/26 Javascript
JS数组Reduce方法功能与用法实例详解
2020/04/29 Javascript
VueCli生产环境打包部署跨域失败的解决
2020/11/13 Javascript
[02:04]2014DOTA2国际邀请赛 BBC小组赛第三天总结
2014/07/12 DOTA
Python3读取文件常用方法实例分析
2015/05/22 Python
python保存数据到本地文件的方法
2018/06/23 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
2018/10/29 Python
在notepad++中实现直接运行python代码
2019/12/18 Python
python 已知平行四边形三个点,求第四个点的案例
2020/04/12 Python
Django中的AutoField字段使用
2020/05/18 Python
New Balance波兰官方商城:始于1906年,百年慢跑品牌
2017/08/15 全球购物
高性能钓鱼服装:Huk Gear
2019/02/20 全球购物
数据库什么时候应该被重组
2012/11/02 面试题
幼儿园义卖活动方案
2014/01/17 职场文书
李培根演讲稿
2014/05/22 职场文书
遵纪守法演讲稿
2014/05/23 职场文书
小学生2014国庆节演讲稿:祖国在我心中
2014/09/21 职场文书
2016年感恩教师节活动总结
2016/04/01 职场文书
MySql如何将查询的出来的字段进行转换
2022/06/14 MySQL