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

JavaScript 获取事件对象的一个注意点

阅读更多
平时我们获取事件对象一般写法如下:

function getEvent(event) {
    return event || window.event  // IE:window.event
}

如果没有参数,也可写成(非IE :事件对象会自动传递给对应的事件处理函数,且为第一个参数):

function getEvent() {
    return arguments[0] || window.event // IE:window.event
}


这样的写法在除 Firefox(测试版本:3.0.12,下同) 外的浏览器上运行都不会有问题,但 Firefox 为什么例外呢?让我们这样一种情形:

<button id="btn" onclick="foo()">按钮</button>
<script>
   function foo(){
       var e =  getEvent();
       alert(e);
   }
</script>


运行结果在 Firefox 中是 undefined,为什么呢?

在 Firefox 中调用其实是这样的,先调用执行的是:

function onclick(event) {
    foo();
}


然后调用执行的是:

function foo(){
   var e =  getEvent();
   alert(e);
}


会发现在 Firefox 下 onclick="foo()" 中的 foo() 无法自动传入事件对象参数,而默认传递给了系统生成的 onclick 函数,那本例我们可以通过 getEvent.caller.caller.arguments[0] 获得事件对象。

因此,我们的 getEvent 可以优化成(参照 yui_2.7.0b 中的 event/event-debug.js 中 getEvent 方法):

function getEvent(event) {
    var ev = event || window.event;
    if (!ev) {
        var c = this.getEvent.caller;
        while (c) {
            ev = c.arguments[0];
            if (ev && (Event == ev.constructor || MouseEvent  == ev.constructor)) { //怿飞注:YUI 源码 BUG,ev.constructor 也可能是 MouseEvent,不一定是 Event
            break;
            }
            c = c.caller;
        }
    }
    return ev;
}
分享到:
评论

相关推荐

    JavaScript 获取事件对象的注意点

    平时我们获取事件对象一般写法如下: 代码如下: function getEvent(event) { return event || window.event // IE:window.event } 如果没有参数,也可写成(非IE :事件对象会自动传递给对应的事件处理函数,且为第...

    javaScript常用事件

    当text对象或textarea对象以及select对象不再拥有焦点、而退到后台时,引发该文件,他与onFocas事件是一个对应的关系。 5.onFocus事件:光标进入文本框时触发调用函数。 当用户单击Text或textarea以及select对象时,...

    sizeof:获取JavaScript对象的大小

    获取一个JavaScript对象的大小(以字节为单位) JavaScript不提供sizeof(类似于C语言),并且程序员无需关心内存分配/重新分配。 但是,根据,每个String值均由16位无符号整数表示,Number使用双精度64位格式IEEE...

    JavaScript详解(第2版)

     15.9.2 注册多个事件   15.9.3 删除事件   15.9.4 Microsoft Internet Explorer中的事件监听器   15.9.5 回顾事件属性   15.10 不唐突的JavaScript   15.11 应知应会   练习   第16章 ...

    源文件程序天下JAVASCRIPT实例自学手册

    第4章 JavaScript基于对象编程 4.1 面向对象编程与基于对象编程 4.1.1 什么是对象 4.1.2 面向对象编程 4.1.3 面向对象编程:继承 4.1.4 面向对象编程:封装 4.1.5 面向对象编程:多态 4.1.6 基于对象编程 4.2 ...

    JavaScript王者归来part.1 总数2

     13.5.1 事件处理模式--一个实现简单事件处理模式的例子   13.5.2 用户事件接口的定义   13.5.3 事件代理和事件注册--一个实现标准事件接口的例子   13.5.4 标准模式--事件分派和接收   13.6 一个例子--...

    JavaScript基础和实例代码

    JavaScript电子书,包括了JavaScript的大部分知识,可以帮助读者快速入门。内容如下: 第1章 JavaScript语言概述 1.1 JavaScript是什么 1.1.1 JavaScript简史 1.1.2 JavaScript有何特点 1.2 JavaScript能做什么 ...

    【JavaScript源代码】JavaScript实现换肤效果(换背景).docx

     本文实例为大家分享了JavaScript实现换肤效果的具体代码,供大家参考,具体内容如下 换肤效果:点击不同图片,更换相应页面背景 实现思路 1、定义一组图片,每个src属性赋值背景图片路径 2、获取一组图片元素...

    Javascript数组操作高级心得整理

    第一章JavaScript基础 1. 如何实现JavaScript 4 (1) 如何把JavaScript代码放到HTML页面里 4  使用[removed]标签,直接在HTML代码里加入JavaScript代码 4  使用[removed]调用外部的JavaScript(.js文件) 4  如何...

    javascript中clipboardData对象用法详解

    本文实例讲述了javascript中clipboardData对象用法。分享给大家供大家参考。具体分析如下: clipboardData对象 ,注意网页里剪贴板到现在只能设置Text类型,即只能复制文本 clearData(“Text”)清空粘贴板 getData...

    JavaScript笔记

    |--x.toString():用于把一个 Number 对象转换为一个字符串,并返回结果 19.正则表达式对象:(专门用于查找和验证) reg.test(‘要验证的完整字符串’)匹配返回true,否则返回false 强调:如果正则表达式使用了^和$...

    Javascript经典正则表达式

    例如通过表达式定位DOM中的一个对象或一系列对象,一个例子就是定位id属性中含有某个特殊字符的div对象。 3)纯编程逻辑。直接用于编程的逻辑之中。 3,说明:本部分所举的正则表达式的代码片断,都是经过测试的,但...

    【JavaScript源代码】javascript实现跟随鼠标移动的图片.docx

    3、获取图片元素对象,将鼠标的 x , y 坐标 分别赋值给图片的 left , top 值,为了时鼠标在图片中间,可以减去图片宽高的一半,让图片位置向上向左,注意:不要忘记加上单位 ‘px'  小知识: e.clientX- - -获取...

    JavascriptObjectTemplates:Javascript 对象的模板

    Javascript 对象模板 Javascript 对象的模板 如何使用? 使用描述类型和默认值的布局对象创建模板。 如果默认值为 null,则该字段可以是任何类型。 var JOT = require ( 'javascript-object-templates' ) ; // ...

    objeq:JavaScript 对象查询

    它可以让你获取一个 JavaScript 数组并查询它。 查询包括过滤、下钻、合成、排序和/或聚合的一个或多个步骤。 它还可选地允许您生成动态结果,这样如果原始 Array 中的任何内容发生更改,查询结果将立即反映这些...

    【JavaScript源代码】javascript实现简单倒计时效果.docx

    3、定义一个计算当前时间和设定时间- - -时间差的函数,将剩余天数、小时、分、秒分别计算计算出来,并赋值给相应的与元素内容 4、使用setInterval()函数,设置每隔1秒执行一次时间差函数, 5、注意setInterval()...

    scopes:将私有范围和受保护范围分配给JavaScript对象

    范围一个为Javascript对象实现私有和受保护范围的库。 支持原型继承,并且可以应用于新对象或现有对象。 作用域模块暴露出defineProperty方法,该方法的扩展Object.defineProperty一起列入一个新的scope可设定为任一...

    dBank 又一款开源的Javascript框架集

    内容索引:脚本资源,Ajax/JavaScript,框架 dBank 又一款开源的Javascript框架集,bBank 是一个轻量级的js框架,提供了css选择器来获取dom对象,ajax等一些功能。  使用bBank的css选择器来获取一个dom对象或dom对象...

    JS日期对象简单操作(获取当前年份、星期、时间)

    本文实例为大家分享了JavaScript获取当前年份、星期、时间的方法,供大家参考,具体内容如下 &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;&lt;/title&gt; &lt;/head...

Global site tag (gtag.js) - Google Analytics