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 相关文章推荐
jQuery获得内容和属性示例代码
Jan 16 Javascript
jquery实现的导航固定效果
Apr 28 Javascript
推荐25个超炫的jQuery网格插件
Nov 28 Javascript
jquery插件jquery.confirm弹出确认消息
Dec 22 Javascript
KnockoutJS 3.X API 第四章之数据控制流component绑定
Oct 10 Javascript
jQuery的extend方法【三种】
Dec 14 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
Feb 09 Javascript
jquery设置css样式的多种方法(总结)
Feb 21 Javascript
Node.js编写CLI的实例详解
May 17 Javascript
微信小程序项目实践之主页tab选项实现
Jul 18 Javascript
vue 动态设置img的src地址无效,npm run build 后找不到文件的解决
Jul 26 Javascript
vue使用refs获取嵌套组件中的值过程
Mar 31 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
Yii2实现UploadedFile上传文件示例
2017/02/15 PHP
Laravel基础_关于view共享数据的示例讲解
2019/10/14 PHP
Mac下关于PHP环境和扩展的安装详解
2019/10/17 PHP
js取得html iframe中的元素和变量值
2014/06/30 Javascript
jQuery UI插件自定义confirm确认框的方法
2015/03/20 Javascript
Bootstrap~多级导航(级联导航)的实现效果【附代码】
2016/03/08 Javascript
jquery表单验证插件formValidator使用方法
2016/04/01 Javascript
EasyUI加载完Html内容样式渲染完成后显示
2016/07/25 Javascript
微信小程序 Flex布局详解
2016/10/09 Javascript
详解获取jq ul第一个li定位的四种解决方案
2016/11/23 Javascript
React Native验证码倒计时工具类分享
2017/10/24 Javascript
使用Node.js在深度学习中做图片预处理的方法
2019/09/18 Javascript
vue中上传视频或图片或图片和文字一起到后端的解决方法
2019/12/01 Javascript
JavaScript Array.flat()函数用法解析
2020/09/02 Javascript
Python实现冒泡,插入,选择排序简单实例
2014/08/18 Python
python中实现迭代器(iterator)的方法示例
2017/01/19 Python
对python GUI实现完美进度条的示例详解
2018/12/13 Python
Django之Mode的外键自关联和引用未定义的Model方法
2018/12/15 Python
django框架模板语言使用方法详解
2019/07/18 Python
Python列表删除元素del、pop()和remove()的区别小结
2019/09/11 Python
命令行运行Python脚本时传入参数的三种方式详解
2019/10/11 Python
python调用接口的4种方式代码实例
2019/11/19 Python
python实现字典嵌套列表取值
2019/12/16 Python
python实现的分析并统计nginx日志数据功能示例
2019/12/21 Python
Python3监控疫情的完整代码
2020/02/20 Python
Python bytes string相互转换过程解析
2020/03/05 Python
python+openCV对视频进行截取的实现
2020/11/27 Python
人事专员岗位职责
2013/11/20 职场文书
简历中个人求职的自我评价模板
2013/11/29 职场文书
信息技术专业个人自我评价
2013/12/11 职场文书
数控技校生自我鉴定
2014/03/02 职场文书
金融事务专业求职信
2014/04/25 职场文书
分公司总经理岗位职责
2014/07/30 职场文书
文明倡议书
2015/01/19 职场文书
单位考核聘任报告
2015/03/02 职场文书
办公用品管理制度
2015/08/04 职场文书