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 给汉字排序实例代码
Jun 28 Javascript
var与Javascript变量隐式声明
Sep 17 Javascript
js获取单元格自定义属性值的代码(IE/Firefox)
Apr 05 Javascript
JS获取下拉列表所选中的TEXT和Value的实现代码
Jan 11 Javascript
jquery中toggle函数交替使用问题
Jun 22 Javascript
JQuery 两种方法解决刚创建的元素遍历不到的问题
Apr 13 Javascript
vue如何从接口请求数据
Jun 22 Javascript
详解vue数据渲染出现闪烁问题
Jun 29 Javascript
JavaScript之class继承_动力节点Java学院整理
Jul 03 Javascript
jQuery自动或手动图片切换效果
Oct 11 jQuery
jquery ajaxfileupload异步上传插件
Nov 21 jQuery
Vue.Draggable拖拽功能的配置使用方法
Jul 29 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+jquery编码方面的一些心得(utf-8 gb2312)
2010/10/12 PHP
lnmp安装多版本PHP共存的方法详解
2018/08/02 PHP
php字符串过滤strip_tags()函数用法实例分析
2019/06/24 PHP
在Laravel中实现使用AJAX动态刷新部分页面
2019/10/15 PHP
懒就要懒到底——鼠标自动点击(含时间判断)
2007/02/20 Javascript
Javascript创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式
2010/06/28 Javascript
jQuery通过控制节点实现仅在前台通过get方法完成参数传递
2015/02/02 Javascript
jquery 根据name名获取元素的value值
2015/02/27 Javascript
jQuery中通过ajax的get()函数读取页面的方法
2016/02/29 Javascript
超漂亮的Bootstrap 富文本编辑器summernote
2016/04/05 Javascript
理解javascript中的闭包
2017/01/11 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
React-router中结合webpack实现按需加载实例
2017/05/25 Javascript
JS中Safari浏览器中的Date
2017/07/17 Javascript
JavaScript实现快速排序的方法分析
2018/01/10 Javascript
Node.js静态服务器的实现方法
2018/02/28 Javascript
vue的diff算法知识点总结
2018/03/29 Javascript
[原创]jquery判断元素内容是否为空的方法
2018/05/04 jQuery
彻底弄懂 JavaScript 执行机制
2018/10/23 Javascript
微信小程序开发中var that =this的用法详解
2020/01/18 Javascript
[36:45]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[44:30]完美世界DOTA2联赛PWL S2 GXR vs Magma 第一场 11.25
2020/11/26 DOTA
python计数排序和基数排序算法实例
2014/04/25 Python
Python实现朴素贝叶斯的学习与分类过程解析
2019/08/24 Python
opencv实现简单人脸识别
2021/02/19 Python
解决pycharm最左侧Tool Buttons显示不全的问题
2019/12/17 Python
python 爬取免费简历模板网站的示例
2020/09/27 Python
饿了么订餐官网:外卖、网上订餐
2019/06/28 全球购物
中学生校园广播稿
2014/01/16 职场文书
爸爸的花儿落了教学反思
2014/02/20 职场文书
师德标兵事迹材料
2014/12/19 职场文书
保管员岗位职责
2015/02/14 职场文书
个人欠条范本
2015/07/03 职场文书
投资入股协议书
2016/03/22 职场文书
如果用一句诗总结你的上半年,你会用哪句呢?
2019/07/16 职场文书
农村房屋租赁合同(范本)
2019/07/23 职场文书