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 相关文章推荐
一个不错的用JavaScript实现的UBB编码函数
Mar 09 Javascript
javaScript 判断字符串是否为数字的简单方法
Jul 25 Javascript
jquery json 实例代码
Dec 02 Javascript
Extjs4 关于Store的一些操作(加载/回调/添加)
Apr 18 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
Jan 12 Javascript
使用javascript提交form表单方法汇总
Jun 25 Javascript
jquery实现左右无缝轮播图
Jul 31 Javascript
javascript内存分配原理实例分析
Apr 10 Javascript
浅谈使用mpvue开发小程序需要注意和了解的知识点
May 23 Javascript
详解Vue基于vue-quill-editor富文本编辑器使用心得
Jan 03 Javascript
JS实现的简单tab切换功能完整示例
Jun 20 Javascript
node 文件上传接口的转发的实现
Sep 23 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许愿墙模块功能分析
2013/06/25 PHP
PHP实现下载断点续传的方法
2014/11/12 PHP
基于JQuery+PHP编写砸金蛋中奖程序
2015/09/08 PHP
PHP实现仿百度文库,豆丁在线文档效果(word,excel,ppt转flash)
2016/03/10 PHP
Yii2中使用join、joinwith多表关联查询
2016/06/30 PHP
php读取本地json文件的实例
2018/03/07 PHP
PHP实现动态删除XML数据的方法示例
2018/03/30 PHP
Dom加载让图片加载完再执行的脚本代码
2008/05/15 Javascript
javascript之学会吝啬 精简代码
2010/04/25 Javascript
13个绚丽的Jquery 界面设计网站推荐
2010/09/28 Javascript
js格式化金额可选是否带千分位以及保留精度
2014/01/28 Javascript
JQuery实现动态适时改变字体颜色的方法
2015/03/10 Javascript
浅谈JavaScript中的作用域和闭包问题
2015/07/07 Javascript
使用Chart.js图表库制作漂亮的响应式表单
2015/10/28 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
2016/03/25 Javascript
详解JS数组Reduce()方法详解及高级技巧
2017/08/18 Javascript
引入JavaScript时alert弹出框显示中文乱码问题
2017/09/16 Javascript
JS实现判断图片是否加载完成的方法分析
2018/07/31 Javascript
解决JQuery的ajax函数执行失败alert函数弹框一闪而过问题
2019/04/10 jQuery
[53:36]Liquid vs VP Supermajor决赛 BO 第三场 6.10
2018/07/05 DOTA
Django中间件工作流程及写法实例代码
2018/02/06 Python
NumPy.npy与pandas DataFrame的实例讲解
2018/07/09 Python
对python 中re.sub,replace(),strip()的区别详解
2019/07/22 Python
详解在Python中使用Torchmoji将文本转换为表情符号
2020/07/27 Python
python3中确保枚举值代码分析
2020/12/02 Python
全球酒店预订网站:Hotels.com
2016/08/10 全球购物
adidas瑞典官方网站:购买阿迪达斯鞋子和运动服
2019/12/11 全球购物
Myprotein西班牙官网:欧洲第一大运动营养品牌
2020/02/24 全球购物
医学护理系毕业生求职信
2013/10/01 职场文书
适用于所有创业者的创业计划书
2014/02/05 职场文书
应届生求职自荐信范文
2014/04/07 职场文书
团队激励口号
2014/06/06 职场文书
会计学毕业生求职信
2014/06/25 职场文书
交通工程专业推荐信
2014/09/06 职场文书
优秀毕业生主要事迹材料
2015/11/04 职场文书
Hive常用日期格式转换语法
2022/06/25 数据库