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 操作cookies及正确使用cookies的属性
Oct 15 Javascript
基于Jquery与WebMethod投票功能实现代码
Jan 19 Javascript
js实现图片漂浮效果的方法
Mar 02 Javascript
Javascript技术难点之apply,call与this之间的衔接
Dec 04 Javascript
JQuery点击行tr实现checkBox选中的简单实例
May 26 Javascript
Vue.js每天必学之构造器与生命周期
Sep 05 Javascript
漂亮实用的页面loading(加载)封装代码
Feb 03 Javascript
深入探究AngularJs之$scope对象(作用域)
Jul 20 Javascript
基于JavaScript实现数码时钟效果
Mar 30 Javascript
JavaScript使用递归和循环实现阶乘的实例代码
Aug 28 Javascript
vue中选项卡点击切换且能滑动切换功能的实现代码
Nov 25 Javascript
Html5生成验证码的示例代码
May 10 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实现小型站点广告管理
2006/10/09 PHP
php表单转换textarea换行符的方法
2010/09/10 PHP
PHP调用Linux的命令行执行文件压缩命令
2013/01/27 PHP
thinkPHP5.0框架简单配置作用域的方法
2017/03/17 PHP
laravel框架查询数据集转为数组的两种方法
2019/10/10 PHP
七种PHP开发环境搭建工具
2020/06/28 PHP
小议Function.apply() 之一------(函数的劫持与对象的复制)
2006/11/30 Javascript
jQuery的一些注意
2006/12/06 Javascript
javascript在一段文字中的光标处插入其他文字
2007/08/26 Javascript
用tip解决Ext列宽度不够的问题
2008/12/13 Javascript
jQuery 渐变下拉菜单
2009/12/15 Javascript
js实现双击图片放大单击缩小的方法
2015/02/17 Javascript
JavaScript实现函数返回多个值的方法
2015/06/09 Javascript
bootstrap组件之导航组件使用方法
2017/01/19 Javascript
文本溢出插件jquery.dotdotdot.js使用方法详解
2017/06/22 jQuery
element-ui 上传图片后清空图片显示的实例
2018/09/04 Javascript
js计算两个时间差 天 时 分 秒 毫秒的代码
2019/05/21 Javascript
laydate只显示时分 不显示秒的功能实现方法
2019/09/28 Javascript
如何基于javascript实现贪吃蛇游戏
2020/02/09 Javascript
vue项目如何监听localStorage或sessionStorage的变化
2021/01/04 Vue.js
[02:50]【扭转乾坤,只此一招】DOTA2永雾林渊版本开启新篇章
2020/12/22 DOTA
pycharm 使用心得(六)进行简单的数据库管理
2014/06/06 Python
python读取word文档的方法
2015/05/09 Python
python中的字典使用分享
2016/07/31 Python
关于Django显示时间你应该知道的一些问题
2017/12/25 Python
pyhanlp安装介绍和简单应用
2019/02/22 Python
Pytorch根据layers的name冻结训练方式
2020/01/06 Python
解决Django Haystack全文检索为空的问题
2020/05/19 Python
python线程池 ThreadPoolExecutor 的用法示例
2020/10/10 Python
使用CSS3制作一个简单的Chrome模拟器
2015/07/15 HTML / CSS
傲盾软件面试题
2015/08/17 面试题
大学生就业自荐信
2013/10/26 职场文书
道德之星事迹材料
2014/05/03 职场文书
马丁路德金演讲稿
2014/05/19 职场文书
redis客户端实现高可用读写分离的方式详解
2021/07/04 Redis
mybatis-plus模糊查询指定字段
2022/04/28 Java/Android