如何在内联添加事件侦听器时获取事件对象

时间:2012-09-27 05:50:07

标签: javascript javascript-events

假设我内联添加事件处理程序,使用元素的onclick attrubute,如下所示:

<input type="button" value="Submit" onclick='buttonClick()' />

然后这是我的处理程序:

<script type="text/javascript">
    window.buttonClick=function(e){
        e=e||window.event;
        alert(e.type);
        return false;
    }
</script>

现在我想知道如何获取事件对象?由于上面的代码会抛出错误:e is undefined

2 个答案:

答案 0 :(得分:2)

在内联事件中使用event变量。

在这种情况下,buttonClick是来自内联事件的函数,名为;被调用的函数没有对event变量的神奇访问权限(window.event是一个IE功能)。此外,在帖子中,使用0个参数调用buttonClick,因此e将始终评估为未定义。

在任何情况下,请与以下内容进行比较,以便从内联事件本身访问the special event variable,然后将事件对象传递给“真实”事件处理函数:

<input type="button" value="Submit"
       onclick="buttonClick(window.event||event)" />

<script type="text/javascript">
    function buttonClick(e) {
        alert(e.type);
        return false;
    }
</script>

(我建议使用jQuery或其他库来简化统一事件访问,但这是另一个故事..)


请注意window.event||event是个小问题:

在IE window.event中,将评估事件对象并将其用作表达式的结果(以便event)永远不会被评估。在非IE浏览器中,window.event将评估为未定义(除非有人正在做一些非常糟糕的事情),因此结果将是event变量的结果。

将此值反转为event||window.event会导致浏览器(即IE)中的ReferenceError不支持W3C本地event变量方法。

答案 1 :(得分:0)

假设您的代码完成了我认为的功能......您只需执行此操作:

<input type="button" value="Submit" onclick='buttonClick(window.event||event)' />