event对象在IE和firefox详解

IE中事件对象是作为全局对象( window.event )存在的,Firefox中则是做为句柄( handler )的第一个参数传入内的。所以一行代码就可以搞定
-收缩JavaScript代码
var evt = window.event || arguments[0];

  下面分四种添加事件的方式讨论,你也许会看到以前没有看到过的获取方式。

 

1,第一种添加事件的方式,直接在html的属性中写JS代码
-收缩HTML代码  运行代码  [如果运行无效果,请自行将源代码保存为html文件运行]
<div onclick="alert(4);">Div1 Element</div>

  大概这是上世纪90年代的写法,那时候直接把js代码写在网页中很普遍,也许那时候的js并不太重要,只是用来做做验证或一些花哨的效果而已。如何在这种添加事件方式下获取到事件对象?IE中很简单,因为event是作为全局对象的,所以直接使用event即可,如下
-收缩HTML代码  运行代码  [如果运行无效果,请自行将源代码保存为html文件运行]
<div onclick="alert(window.event.type);">Div1 Element

  点击该Div后,IE中会弹出'click'字符的信息框。说明事件对象获取到了,如果在 Opera/Safari/Chrome 中也测试了,会发现效果和IE一样,说明 Opera/Safari/Chrome 中也支持IE方式( window.event )获取事件对象。


  Firefox中会报错,提示:window.event is undefined,说明Firefox不支持IE方式获取事件对象而是以句柄的第一个参数传入的,文章开头意见提到了。

  上面的用 window.event 来获取事件对象,其实window可以省略的,就像使用alert而不是window.alert一样。如
-收缩HTML代码  运行代码  [如果运行无效果,请自行将源代码保存为html文件运行]
<div onclick="alert(event.type);">Div1 Element</div>

  在 IE/Opera/Safari/Chrome 中测试,和刚刚不会有什么区别。在Firefox中再测,会有个惊喜,你会发现居然弹出的是"click"信息框,而不是"undefined"。

  两次测试区别仅仅一个用window.event.type,一个用event.type。这个问题下面详细讨论。

  下面用句柄第一个参数来获取事件对象,可以把onclick属性的值想象成一个匿名函数,onclick属性值的字符串实际上都是这个匿名函数内的js代码。


  既然这样,我们就可以通过Function的一个属性argumengs获取到该匿名函数的第一个参数,而该参数就是事件对象。如
-收缩HTML代码  运行代码  [如果运行无效果,请自行将源代码保存为html文件运行]
<div onclick="alert(arguments[0].type);">Div1 Element</div>

IE中会报错,提示:arguments.0.type为空或不是对象
Firefox/Opera/Safari/Chrome 中会弹出"click"内容的信息框,说明他们都支持事件对象作为句柄第一个参数传入。从侧面也说明了 Opera/Safari/Chrome 不仅支持W3C标准方式获取事件对象,同时也兼容了IE方式获取事件对象。

  既然知道onclick对应的是一个匿名函数,我们不妨把该匿名函数打印出来看看,只需以下代码
-收缩HTML代码  运行代码  [如果运行无效果,请自行将源代码保存为html文件运行]
<div onclick="alert(arguments.callee);">Div1 Element</div>

在各浏览器中点击该Div,结果如下:

IE6/7/8 :

function onclick(){ alert(arguments.callee);}

IE9 :

 function onclick(event){ alert(arguments.callee);}

Firefox / Safari :
function onclick(event) { alert(arguments.callee);}

Chrome :
function onclick(evt) { alert(arguments.callee);}

Opera :

 function anonymous(event) {alert(arguments.callee);}

观察这些函数发现:

IE6/7/8没有定义参数

IE9/Firefox/Safari/Opera 定义了参数event

Chrome定义了参数evt。(注:新版chrome已改为event)

 

现在回到上面遗留的问题,如下
-收缩HTML代码  运行代码  [如果运行无效果,请自行将源代码保存为html文件运行]
<div onclick="alert(window.event.type);">Div1 Element</div>
<div onclick="alert(event.type);">Div1 Element</div>

  这两个div的区别仅window.event.type和event.type。分别点击后,后者在Firefox中不弹 出"undefined",而是"click",是因为Firefox中匿名函数定义了参数event,该参数刚好与IE的全局对象event同名,从而 误以为Firefox也支持IE方式获取事件对象。

  同样的道理,Chrome中定义的参数是evt,那么在Chrome中还可以通过以下方式获取事件对象,如下
-收缩HTML代码  运行代码  [如果运行无效果,请自行将源代码保存为html文件运行]
<div onclick="alert(evt);">Div1 Element</div>

 

2,第二种添加事件的方式,定义一个函数,赋值给html元素的onXXX属性
-收缩HTML代码  运行代码  [如果运行无效果,请自行将源代码保存为html文件运行]
<script type="text/javascript">
     function clk(){}
</script>
<div onclick="clk()">Div2 Element</div>

  先定义函数clk,然后赋值给onclick属性,这种方式也应该属于上世纪90年代的流行写法。比第一种方式好的是它把业务逻辑代码都封装在一个函数里了,使HTML代码与JS代码稍微有点儿分离,不至于第一种那么紧密耦合。

  如何在这种方式(clk函数内)中获取事件对象?IE中使用全局对象event仍然没问题,如:
-收缩HTML代码  运行代码  [如果运行无效果,请自行将源代码保存为html文件运行]
<script type="text/javascript">
    function clk(){alert(window.event);}
</script>
<div onclick="clk()">Div2 Element</div>

  点击Div后,除Firefox外,IE/Opera/Safari/Chrome都能正常获取事件对象。上面已经提到了 Opera/Safari/Chrome 兼容IE方式(window.event)获取事件对象,而唯独Firefox不支持。从而Firefox中只能通过参数传入了。试着这么写
-收缩HTML代码  运行代码  [如果运行无效果,请自行将源代码保存为html文件运行]
<script type="text/javascript">
    function clk(){alert(event);}
</script>
<div onclick="clk()">Div2 Element</div>

  因为在Firefox中匿名函数是具有event参数的,而clk()是在匿名函数之内的,打印出匿名函数便知
-收缩HTML代码  运行代码  [如果运行无效果,请自行将源代码保存为html文件运行]
<script type="text/javascript">
    function clk(){alert(arguments.callee.caller);}
</script>
<div onclick="clk()">Div2 Element</div>

点击该Div,Firefox弹出信息框内容如下
-收缩JavaScript代码
function onclick(event) {
    clk();
}

  回到clk中的alert(event),既然匿名函数的event传入了,那么在该闭包中clk是可以获取到event的,事实上点击后 Firefox会报错:event is not defined。猜测该匿名函数的闭包和function clk(){alert(event);}不是同一个闭包环境。这种方式不行,则只能通过显示的参数传入了,如
-收缩HTML代码  运行代码  [如果运行无效果,请自行将源代码保存为html文件运行]
<script type="text/javascript">
    function clk(e){alert(e);}
</script>
<div onclick="clk(arguments[0])">Div2 Element</div>

点击Div,在Firefox中正确弹出了事件对象,支持参数传入的浏览器都可以,如Opera/Safari/Chrome。
把以上代码中的arguments[0]改成event,那么所有浏览器都支持。
把以上代码中的arguments[0]改成window.event,那么将只有Firefox不支持。
把以上代码中的arguments[0]改成evt,那么将只有Chrome支持。

思考下为什么?

 

3,第三种添加事件方式,使用element.onXXX方式
-收缩HTML代码  运行代码  [如果运行无效果,请自行将源代码保存为html文件运行]
<div id="d3">Div3 Element</div>
<script type="text/javascript">  
    var d3 = document.getElementById('d3');
    d3.onclick = function(){    }
</script>

  这种方式也比较早期,但好处是可以将JS与HTML完全分离,但前提是需要给HTML元素提供一个额外的id属性(或其它能获取该元素对象的方式)。

  这种方式添加事件IE6/7/8只支持window.event不支持参数传入,Firefox只支持参数传入不支持其它方式。IE9/Opera/Safari/Chrome 两种方式都支持。

 

4,第四种添加事件方式,使用addEventListener或IE专有的attachEvent
-收缩HTML代码  运行代码  [如果运行无效果,请自行将源代码保存为html文件运行]
<div id="d4">Div4 Element</div>
<script type="text/javascript">
var d4 = document.getElementById('d4');
function clk(){alert(4)}
if(d4.addEventListener){
d4.addEventListener('click',clk,false);
}
if(d4.attachEvent){
d4.attachEvent('onclick',clk);
}
</script>

  这是目前推荐的方式,较前两种方式功能更为强大,可以为元素添加多个句柄(或称响应函数),支持事件冒泡或捕获,前三种方式默认都是冒泡。当然IE6/7/8仍然没有遵循标准而使用了自己专有的attachEvent,且不支持事件捕获。IE9 中已经支持addEventListener了。

  先用window.event测试,如
-收缩HTML代码  运行代码  [如果运行无效果,请自行将源代码保存为html文件运行]
<script type="text/javascript">
    var d4 = document.getElementById('d4');
    function clk(){alert(window.event)}
    if(d4.addEventListener){
        d4.addEventListener('click',clk,false);
    }
    if(d4.attachEvent){
        d4.attachEvent('onclick',clk);
    }
</script>

点击Div[id=d4],IE/Opera/Safari/Chrome都正确的弹出了事件对象信息框,Firefox弹出的是"undefined",预料之中,因为Firefox不支持window.event作为事件对象。

再换成句柄的第一个参数测试,如
-收缩HTML代码  运行代码  [如果运行无效果,请自行将源代码保存为html文件运行]
<script type="text/javascript">
    var d4 = document.getElementById('d4');
    function clk(e){alert(e)}
    if(d4.addEventListener){
        d4.addEventListener('click',clk,false);
    }
    if(d4.attachEvent){
        d4.attachEvent('onclick',clk);
    }
</script>

  测试之前,猜测一下什么结果,可能有人会觉得IE中应该弹出undefined,其它浏览器都是事件对象。事实上所有浏览器弹出的信息框显示都是事件对象。

总结下:

1,IE6/7/8支持通过window.event获取对象,通过attachEvent方式添加事件时也支持事件对象作为句柄第一个参数传入

2,Firefox只支持事件对象作为句柄第一个参数传入

3,IE9/Opera/Safari/Chrome两种方式都支持

 

各浏览器获取事件event对象列表

 

event 对象兼容火狐、谷歌、ie浏览器问题 项目中遇到这样一个业务需求:给动态生成的页面元素(input、div、checkbox等)添加事件,业务实现的难点在于:动态生成的页面元素的id、name都是按一定规则赋值的(例如:input1、input2..),那么给这些元素添加事件需要获取到动态生成元素的id或name属性值,根据属性值取到元素对象然后添加事件。 经过以上分析不难看出:难点就在于取得... 阅读详情

相关推荐

兼容IE和FireFox的event(事件)的对象获得

兼容IE和FireFox的event(事件)的对象获得,直接下载引用即可

IE中的事件对象window.event

和dom中的事件对象做对比: 几个重要的方法和属性分别是: (1)事件类型:同为type属性; (2)事件作用目标:ie为srcElement属性; (3)阻止事件冒泡:ie为canceBubble属性;(设置为ture为阻止冒泡,false为允许); (4)阻止事件默认行为:ie为retureValue属性;(设置为ture为阻止,false是允许); 同样通过判断浏览器的能力来选择

bobobe的专栏 4625

火狐和ie下获取javascript 获取event的方法(推荐)

javascript 获取event 先从一个简单的例子说起,一个简单的button控件如下: <input type=’button’ name=’mybtn’ id=’mybtn’ onclick=’myFunc()’/> 然后为其注册事件,这样的情况,怎么在javascript里获取event呢,特别是firefox的情况。请看: [removed] function myFunc(){ var ev = window.event || arguments.callee.caller.arguments[0] ,et = ev.

event对象获取方法总结

简介: Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。 事件通常与函数结合使用,函数不会在事件发生前被执行! Event对象的获取方法: 方法一: 例如:function demo1(e){ var e = e || window.event; //此种方法在ie中和google中可以不传参数e也可以获取到event,...

836811384 1013

从零开始Cubemx配置STM32搭载freeRTOS以及lwip实现tcp网络通信(二)

Cubemx配置LWIP,实现网络通信

qq_30623327的博客 1万+

Python_构建同花顺问财智能选股API服务

本文详细介绍了如何使用Python构建同花顺问财智能选股API服务,涵盖从环境准备、核心API开发到高级功能扩展的全过程。通过Flask框架和pywencai库,开发者可以快速搭建稳定可靠的选股接口,实现自动化股票筛选与交易系统集成,提升量化投资效率。

weixin_30596343的博客 333

添加事件监听兼容IE6-8

IE8一下浏览器不支持addEventListener,用attachEvent取而代之,但是在时间类型前面要加上’on‘,例如click时间在attachEvent中要写成onclick。 var addEvent = function (o, e, f) {   o.addEventListener ? o.addEventListener(e, f, false) : o.at...

weixin_30699235的博客 170

树莓派4B+DroneKit实战:手把手教你用Python控制无人机飞行(附避坑指南)

本文提供了一份详尽的树莓派4B与DroneKit配置实战指南,涵盖从硬件选型、软件环境搭建到Python编程控制无人机的完整流程。文章重点解决了ARM架构下的兼容性问题、MAVLink通信配置及端口管理等常见难题,并附带了实用的避坑指南和代码示例,帮助开发者构建稳定可靠的无人机控制系统。

weixin_29056781的博客 410

Firefox下的event对象

有时候在某个事件被触发时,我们希望能得到事件对象本身。IE下很简单,用window.event来代表事件对象,经测试,chrome、opera也支持window.event,所以在这几个浏览器下推荐使用window.event,简单! 但是Firefox并不支持window.event,而是把事件对象作为第一个参数传给事件处理函数,显式或者隐式传递都可以,IE9既支持window.event又支

Legend1988的专栏 4912

物理专业书库模板(1):物理学书单(适合物理专业本科生、研究生、科研工作者、物理爱好者...)

物理专业书库模板(1):物理学书单(适合物理专业本科生、研究生、科研工作者、物理爱好者...) 求赞求喜欢求分享,建议关注,防止文章丢失。

hepyang的博客 2179

KLayout教程(二)编辑不同的形状

首先画一个基础的矩形,然后双击他可以定义他的坐标

集成光电子 1万+

兼容IE和Firefox的event对象

<br />IE 中可以直接使用 event 对象,而 FF 中则不可以,一般 可以通过以下两种方法满足event 对象需要:<br />第一种方法:<br /> var theEvent = window.event || arguments.callee.caller.arguments[0];<br />第二种是将 event 作为参数来传递:<br /> function xxx(e){var theEvent = window.event || e;}<br />以上两种方法只能用于事发现

jinwei_zhiyuan的专栏 373

基于UWB技术的自动跟随避障系统设计研究

基于UWB技术的自动跟随避障系统设计研究 摘要:目前我国针对自动跟随避障系统方面的研究较少,同时国内自动跟随避障系统仍然处在未成熟阶段,多数仍停留在应用蓝牙控制或摄像头捕捉这类跟随方式,但这类方式在实际应用过程中往往会出现易受干扰,精度差,易受环境干扰等问题,这不仅会降低自动跟随避障系统的性能,同时也会对用户造成诸多困扰。因此,就需要结合目前较为有效的UWB技术,对自动跟随避障系统进行设计。基于此,本文首先将会针对UWB技术展开概述,而后对基于UWB技术的自动跟随避障系统组成展开分析,进而对基于UWB技术的

qq_43543515的博客 7992

IE的event.srcElement和Firefox的event.target

在IE下,event对象有srcElement属性,但是没有target属性;Firefox下,even对象有target属性,但是没有srcElement属性.。     解决方法:使用obj(obj = event.srcElement? event.srcElement :event.target;)来代替IE下的event.srcElement或者Firefox下的ev

远 2113

ctfshow WEB web4

ctfshow WEB web4

weixin_68416970的博客 721

Kindle电子书DRM破解全攻略:从下载到转换的完整流程(含最新DeDRM插件配置)

本文详细介绍了如何合法移除个人购买的Kindle电子书的DRM保护,实现跨设备阅读与备份。核心内容包括使用最新DeDRM插件(如noDRM分支)配合Calibre进行配置,并针对亚马逊最新的KFX加密格式提供了密钥提取与实战操作指南。文章强调该方法仅适用于个人合理使用,旨在帮助读者真正掌控自己的数字资产。

delta的博客 576

IE浏览器下event.keycode 缺少对象

这是ie特有的错误消息 因为事件对象在ie中是放在window下的,而在其他浏览器中是作为一个参数传入侦听器函数的,并且是第一个参数 你应该把事件侦听器的第一个参数设为e 然后函数第一句应该是e=e||window.event; 这样在ie和其他浏览器中都能运行正常 错误写法: if(event.keyCode==13){ //这是运行IE会报出缺少对象 这个错是IE特有的错误消...

FurtherSkyQ的博客 1039

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IE和firefox下event区别

如果在使用javascript的时候涉及到event处理,就需要知道event在不同的浏览器中的差异,因为javascript的事件模型有三种,它们分别是NN4、IE4+和W3C/Safari;这也造成了在不同的浏览器中处理event的差异,这里结合一些零碎的代码来说明如何做到event在IE4+和Firefox下的正常工作。首先看如下代码: function doEventThing(ev

541

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

JS event 兼容 IE和FireFox

event对象 IE 中可以直接使用 event 对象,而 FF 中则不可以,解决方法之一如下: var theEvent = window.event ||arguments.callee.caller.arguments[0]; 第二种是将 event 作为参数来传递: function xxx(e){var theEvent = window.event || e;} srcEle

shanhuchong67的专栏 296

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

JS中的event 对象详解

JS中的event 对象详解 JS的event对象 Event属性和方法:1. type:事件的类型,如onlick中的click;2. srcElement/target:事件源,就是发生事件的元素;3. button:声明被按下的鼠标键,整数,1代表左键,2代表右键,4代表中键,如果按下多个键,酒把这些值加起来,所以3就代表左右键同时按下;(firefox中 0代表左键,1代表中间键,...

u011927449的博客 1242

firefox下window.event的解决方法

在FireFox下编写事件处理函数是很麻烦的事.因为FireFox并没有 window.event . 如果要得到 event 对象,就必须要声明时间处理函数的第一个参数为event.所以为了兼容IE与FireFox,一般的事件处理方法为:btn.onclick=handle_btn_click;function handle_btn_click(evt){    if(evt==null)evt

1万+

JS 获得event 兼容IE Firefox

文章来源:http://blog.163.com/zyxc_2001/blog/static/38943422200910442326359/ event对象在IE和Firefox下的不同用法 IE: 可以直接用window.event或event获得event对象,同时可直接用event.x或event.y获得当前操作位置的x和y坐标,当然还有其它属性,如:sr

north_easter的专栏 4729

JS中如何传递Event对象,兼容IE和FireFox

(1)IE 在IE中,事件没有event属性,但是window有,即window.event。 获取event的方式为: document.onclick=function(){ alert(window.event.clientX); } 获取调用事件的对象window.event.srcElement (2)FIreFox FireFox中没有window.event,

michael8512的博客 1910
上一篇: Prototype源码浅析
下一篇: Objective-J 面向对象javascript
sfSam
博客等级 码龄16年 13粉丝 115原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值