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倒计时页面跳转实例小结
Sep 11 Javascript
JS获取图片高度宽度的方法分享
Apr 17 Javascript
Bootstrap基本组件学习笔记之input输入框组(9)
Dec 07 Javascript
快速使用node.js进行web开发详解
Apr 26 Javascript
Bootstrap布局之栅格系统学习笔记
May 04 Javascript
微信小程序picker组件下拉框选择input输入框的实例
Sep 20 Javascript
Less 安装及基本用法
May 05 Javascript
让你5分钟掌握9个JavaScript小技巧
Jun 09 Javascript
vuex 解决报错this.$store.commit is not a function的方法
Dec 17 Javascript
微信小程序制作表格的方法
Feb 14 Javascript
Vue.js中的高级面试题及答案
Jan 13 Javascript
vue如何实现关闭对话框后刷新列表
Apr 08 Vue.js
替代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
关于Sphinx创建全文检索的索引介绍
2013/06/25 PHP
兼容各大浏览器带关闭按钮的漂浮多组图片广告代码
2014/06/05 PHP
PHP调用.NET的WebService 简单实例
2015/03/27 PHP
PHP中应该避免使用同名变量(拆分临时变量)
2015/04/03 PHP
JavaScript 编程引入命名空间的方法与代码
2007/08/13 Javascript
Mozilla 表达式 __noSuchMethod__
2009/04/05 Javascript
jQuery 学习 几种常用方法
2009/06/11 Javascript
jQuery中判断一个元素是否为另一个元素的子元素(或者其本身)
2012/03/21 Javascript
JS实现遮罩层效果的简单实例
2013/11/12 Javascript
jQuery选择器全面总结
2014/01/06 Javascript
jQuery+css3动画属性制作猎豹浏览器宽屏banner焦点图
2015/03/16 Javascript
js简单实现调整网页字体大小的方法
2016/07/23 Javascript
jQuery实现定位滚动条位置
2016/08/05 Javascript
JavaScript中闭包之浅析解读(必看篇)
2016/08/25 Javascript
表单input项使用label同时引用Bootstrap库导致input点击效果区增大问题
2016/10/11 Javascript
整理关于Bootstrap导航的慕课笔记
2017/03/29 Javascript
vue2.0 常用的 UI 库实例讲解
2017/12/12 Javascript
用jquery获取select标签中选中的option值及文本的示例
2018/01/25 jQuery
jquery+css3实现熊猫tv导航代码分享
2018/02/12 jQuery
vuex直接赋值的三种方法总结
2018/09/16 Javascript
vue cli4.0项目引入typescript的方法
2020/07/17 Javascript
vue3.0自定义指令(drectives)知识点总结
2020/12/27 Vue.js
[46:58]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第一场 12.17
2020/12/19 DOTA
使用Python编写爬虫的基本模块及框架使用指南
2016/01/20 Python
python中多层嵌套列表的拆分方法
2018/07/02 Python
Spring @Enable模块驱动原理及使用实例
2020/06/23 Python
商务主管岗位职责
2013/12/08 职场文书
文体活动总结范文
2014/05/05 职场文书
企业人事任命书
2014/06/05 职场文书
教师师德师风整改措施
2014/10/24 职场文书
中学推普周活动总结
2015/05/07 职场文书
党员转正意见怎么写
2015/06/03 职场文书
2016年幼儿园教师政治学习心得体会
2016/01/23 职场文书
2016年安全生产先进个人事迹材料
2016/02/29 职场文书
阿里云Nginx配置https实现域名访问项目(图文教程)
2021/03/31 Servers
CSS 还能这样玩?奇思妙想渐变的艺术
2021/04/27 HTML / CSS