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 相关文章推荐
背景音乐每次刷新都可以自动更换
Feb 01 Javascript
JS对img标签进行优化使用onerror显示默认图像
Apr 24 Javascript
JavaScript中的splice()方法使用详解
Jun 09 Javascript
javascript设置文本框光标的方法实例小结
Nov 04 Javascript
JS实现“隐藏与显示”功能(多种方法)
Nov 24 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
Dec 02 Javascript
JavaScript表单验证完美代码
Mar 02 Javascript
Angular2学习教程之TemplateRef和ViewContainerRef详解
May 25 Javascript
JavaScript满天星导航栏实现方法
Mar 08 Javascript
其实你可以少写点if else与switch(推荐)
Jan 10 Javascript
node.js使用zlib模块进行数据压缩和解压操作示例
Feb 12 Javascript
JavaScript动画实例之粒子文本的实现方法详解
Jul 28 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
mysql 中InnoDB和MyISAM的区别分析小结
2008/04/15 PHP
PHP正则替换函数preg_replace和preg_replace_callback使用总结
2014/09/22 PHP
PHP实现的数组和XML文件相互转换功能示例
2018/03/15 PHP
Javascript异步表单提交,图片上传,兼容异步模拟ajax技术
2010/05/10 Javascript
验证码按回车不变解决方法
2013/03/29 Javascript
JS阻止冒泡事件以及默认事件发生的简单方法
2014/01/17 Javascript
一看就懂:jsonp详解
2015/06/01 Javascript
JavaScript函数的调用以及参数传递
2015/10/21 Javascript
ES6中Proxy代理用法实例浅析
2017/04/06 Javascript
Angular 4 依赖注入学习教程之FactoryProvider的使用(四)
2017/06/04 Javascript
JS控制鼠标拒绝点击某一按钮的实例
2017/12/29 Javascript
vue微信分享出来的链接点开是首页问题的解决方法
2018/11/28 Javascript
JS监听组合按键思路及实现过程
2020/04/17 Javascript
vue实例的选项总结
2020/06/09 Javascript
Vue清除定时器setInterval优化方案分享
2020/07/21 Javascript
[05:13]2018DOTA2亚洲邀请赛主赛事第二日战况回顾 LGD、VG双雄携手晋级
2018/04/05 DOTA
python笔记(2)
2012/10/24 Python
python中将字典转换成其json字符串
2014/07/16 Python
简单介绍Python中的JSON模块
2015/04/08 Python
python 中字典嵌套列表的方法
2018/07/03 Python
使用Python爬虫库requests发送表单数据和JSON数据
2020/01/25 Python
Python日志logging模块功能与用法详解
2020/04/09 Python
Python matplotlib绘制图形实例(包括点,曲线,注释和箭头)
2020/04/17 Python
IntelliJ 中配置 Anaconda的过程图解
2020/06/01 Python
python 获取剪切板内容的两种方法
2020/11/28 Python
Python try except finally资源回收的实现
2021/01/25 Python
国外平面设计第一市场:99designs
2016/10/25 全球购物
美国高档百货Nordstrom的折扣店:Nordstrom Rack
2017/11/13 全球购物
美国在线艺术商店:HandmadePiece
2020/11/06 全球购物
《小儿垂钓》教学反思
2014/02/23 职场文书
竞聘书怎么写,如何写?
2014/03/31 职场文书
爱国主义演讲稿
2014/05/07 职场文书
解除劳动合同协议书范本2014
2014/09/25 职场文书
校长师德表现自我评价
2015/03/05 职场文书
唱歌比赛拉拉队口号
2015/12/25 职场文书
股东出资协议书
2016/03/21 职场文书