`
JavaSam
  • 浏览: 954970 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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,Firefox,Chrome)

    ### event兼容调用详解——IE,Firefox,Chrome 在跨浏览器开发中,处理事件(event)的兼容性问题是一项常见的挑战。不同的浏览器对事件模型的支持程度不同,这导致了开发者在编写JavaScript代码时需要考虑多种...

    ie 和 firefox 的javascript 兼容问题(网上下载的).doc

    ### IE和Firefox的JavaScript兼容性问题详解 #### 1. `document.formName.item("itemName")` 问题 在处理表单元素时,IE 和 Firefox 对 `document.formName.item("itemName")` 的支持存在差异。 **说明:** - **...

    兼容IE与FireFox

    由于IE和Firefox在事件对象的获取上有差异,我们需要编写一段通用的代码来适应这两种情况。以下是一段示例代码: ```javascript function test(event) { var event = event || window.event; // doSomething } ``...

    ie firefox 兼容问题大全

    ### IE与Firefox兼容性问题详解 #### 一、概述 在网页开发过程中,浏览器兼容性问题一直是前端开发者面临的重要挑战之一。尤其是对于早期版本的Internet Explorer(简称IE)与Mozilla Firefox(简称Firefox)来说...

    Javascript的IE和Firefox兼容性汇编 .txt

    ### JavaScript的IE与Firefox兼容性问题详解 #### 引言 在Web开发中,确保脚本能在不同浏览器间正常运行是非常重要的。特别是对于早期版本的Internet Explorer (IE) 和 Firefox (MF),由于它们对JavaScript的支持...

    javascript 支持ie和firefox杰奇翻页函数.docx

    ### JavaScript支持IE和Firefox的杰奇翻页函数详解 #### 一、背景介绍 随着互联网技术的发展,网页浏览成为人们日常获取信息的重要途径之一。在众多网页内容管理系统中,杰奇(JieQi)小说系统因其简洁易用、功能...

    firefox与IE对js和CSS的区别.txt

    ### Firefox与IE对JS和CSS的兼容性差异详解 #### 一、概述 随着Web技术的发展,浏览器成为了连接用户与互联网的重要桥梁。然而,不同浏览器对JavaScript(简称JS)及CSS的支持程度各不相同,这给前端开发人员带来...

    Firefox浏览器兼容JS脚本

    在处理CSS兼容性问题时,有时会发现某些CSS属性在Firefox和IE中的表现不同。例如,“cursor: hand;”在IE中显示为手形光标,而在Firefox中可能不被识别。这种情况下,建议使用“cursor: pointer;”以确保跨浏览器的...

    js键盘事件参考学习_兼容FireFox和IE

    事件对象`event`在`keydown`、`keypress`和`keyup`中具有通用属性,如`altKey`、`ctrlKey`和`shiftKey`,它们指示是否有Alt、Ctrl或Shift键与其他键一起被按下,这些属性在Firefox和IE中都可用。 **第二部分:兼容...

    IE、火狐兼容性问题

    本文主要探讨的是IE(Internet Explorer)与火狐(Firefox)这两种浏览器在JavaScript编程中所遇到的一些常见兼容性问题,并提出相应的解决方案。 #### 二、关键兼容性问题及解决方法 ##### 1. 获取DOM元素的方式 ...

    给moz-firefox下添加IE方法和属性

    - **removeNode** 和 **swapNode** 方法主要用于DOM操作,在IE中可用,但在Firefox和其他基于Webkit或Gecko引擎的浏览器中并不支持。 - 为了解决这一问题,可以通过自定义原型的方式,使Firefox等浏览器也能支持这些...

    event和srcElement说明,方法,技巧

    这个属性在Internet Explorer(IE)浏览器中被广泛支持,但在非IE浏览器中,如Firefox、Chrome等,则使用`event.target`属性来达到相同的目的。 #### 三、event.srcElement与event.target 在IE中,`event....

    Javascript的IE和Firefox兼容性汇编(zz)

    `window.event` 对象在IE中可以全局访问,但在Firefox中只能在事件触发的上下文中使用。 **解决方法**: 为了确保代码的兼容性,可以在事件处理函数中传递一个参数来接收事件对象。示例代码: ```html 提交" onclick...

    IE和ff的兼容技巧

    ### IE与Firefox的兼容技巧详解 #### 一、概述 在网页开发过程中,浏览器兼容性问题一直是前端开发者面临的重要挑战之一。不同的浏览器由于其内核的不同,在解析HTML、CSS及JavaScript时存在差异,这就导致了相同...

    js中的触发事件对象event.srcElement与event.target详解

    例如,在IE浏览器中,事件对象包含srcElement属性,而在Firefox及其他遵循DOM标准的浏览器中,则使用target属性。尽管两者在不同浏览器中的实现有所不同,但其功能是相似的,即指向触发事件的元素。通过event....

    IE和FF兼容问题

    在众多浏览器中,Internet Explorer(简称IE)与Firefox因其庞大的用户基数而成为了开发人员不得不重点关注的对象。由于不同版本之间的差异以及与其它现代浏览器(如Chrome、Opera等)之间的区别,导致了诸多兼容性...

    js兼容问题 详解

    以下以 IE 代替 Internet Explorer,以 MF/FF 代替 Mozzila Firefox //window.event IE:有window.event对象 FF:没有window.event对象。可以通过给函数的参数传递event对象。如onmousemove=doMouseMove(event)...

    firefox 和 ie 事件处理的细节,研究,再研究 书写同时兼容ie和ff的事件处理代码

    通过观察`foo1`、`foo2`和`foo3`函数,我们可以看到在IE中可以通过`window.event`获取事件对象,而在Firefox中则是通过函数的第一个参数`e`或`arguments[0]`来获取。 ##### 3.2 示例2:处理`onclick`属性内直接调用...

    JavaScript event对象整理及详细介绍

    值得注意的是,在Firefox中,target属性和srcElement的用法存在差异。 button属性描述了被按下的鼠标键。通常,1代表左键,2代表中键,4代表右键。如果同时按下多个键,则需要将相应的值相加。例如,3表示左键和...

    IE与FF脚本兼容性问题

    本文主要探讨Internet Explorer(简称IE)与Mozilla Firefox(简称FF或MF)之间在JavaScript脚本执行时存在的兼容性问题。这些问题涉及到文档对象模型(DOM)操作、事件处理等多个方面,对于开发跨浏览器兼容的应用...

Global site tag (gtag.js) - Google Analytics