33

我是 Javascript 的初学者。当我练习时,我注意到了一些事情。

采取这个功能:

<script type="text/javascript">
    function showChar(sSomeData, oEvent)
    {
        alert (oEvent.keyCode);
        return true;
    }

</script>

当我这样调用这个函数时:

 <input type="text" id="txtTextBox" onkeypress="return showChar('some text', oEvent);" />

我收到一个 JS 错误:“Microsoft JScript 运行时错误:'oEvent' 未定义”

但是,如果我将 oEvent 重命名为“事件”,例如:

<input type="text" id="txtTextBox" onkeypress="return showChar('some text', event);" />

然后它工作正常。我的结论是“事件”是一个保留字,代表 Java Script 中的事件参数。但是当我查看网络时,我并没有将“事件”视为保留字。

我弄错了还是没有真正记录为保留字?

谢谢!

4

6 回答 6

32

它不是保留关键字,但至少在 IE 中是全局变量。

于 2009-10-02T15:04:32.593 回答
31

最初让我感到困惑的是,不了解编码事件处理程序的约定与命名变量的实际工作方式,以及设置事件处理程序时 Javascript 处理程序完成的隐式调用,如下所示:

好 1

document.getElementById('testId').onkeypress = function(e) {
     console.log(e.which);
}

上面,您的浏览器将event作为函数的第一个参数隐式传递给处理程序,因此您可以将参数(此处为e)命名为任何您想要的名称,只要您是一致的,即使您像这样发疯:

好 2; 创造性地命名

document.getElementById('testId').onkeypress = function(aWhopBopALuWhop) {
     console.log(aWhopBopALuWhop.which);
}

但是由于这种方式event被用作全局,像这样的粗糙代码也可以工作:

粗鲁的范围界定 1

document.getElementById('testId').onkeypress = function(aWhopBopALuWhop) {
     console.log(event.which);   // <<< decidedly NOT aWhopBopALuWhop
}

因此,您可能还会看到这样的双重代码:

粗鲁的范围界定 2

document.getElementById('testId').onkeypress = function(event) {
     console.log(event.which);
}

现在event是哪个event?不幸的是,这没关系。无论范围如何,我们始终event都使用eventso event=== event![原文如此]

但这确实表明这event 不是保留字。这是一个变量。所以你不能说的地方break = "spam";,你可以event = "spam";。因此,如果您尝试使用保留的 ,它会break失败

document.getElementById('testId').onkeypress = function(break) {
     console.log(break.which);
}

重要的是要学习(我相信 Ionut 本质上是在说什么),无论您在函数定义中如何调用它,您的浏览器都会默默地将“全局”变量传递给event您的处理程序。onkeypress令人困惑的是,即使您不使用参数event在处理程序中访问,您仍然可以event作为全局访问,如上面的Cruddy 1 & 2所示。

现在,当我使用 html-land 调用时onkeypress,范式开始在我脑海中混杂。event在这里,您的处理程序函数的参数没有静默传递。您必须明确传递event自己,如下所示:

<script>
    function handlerNamed(namedParam) {
        console.log(namedParam.which);
    }
</script>
<input type="text" size="10" onkeypress="handlerNamed(event)"><br />

没有其他约定有效! 这只是因为浏览器支持它,而不是因为任何 ECMAscript 标准定义event(afaik)。您不能通过更改参数名称以匹配 in 来使用以下任何内容,就像您“可以”与 .onKeyPress 一样handlerNamed

<!-- NONE OF THESE WORK, b/c ONLY event is defined! -->
<input type="text" size="10" onkeypress="handlerNamed(evt)"><br />
<input type="text" size="10" onkeypress="handlerNamed(e)"><br />
<input type="text" size="10" onkeypress="handlerNamed(aWhopBopALuWhop)"><br />

有道理?我正处于一个过于复杂的 jsFiddle中间,试图在它最终点击之前将其写出来,以防万一。

于 2012-12-24T18:04:23.007 回答
10

好吧,代码:

onkeypress="return showChar('some text', oEvent);"

等效于以下 JavaScript 代码:

element.onkeypress = function (eventObjectName) {
    return showChar('some text', eventObjectName);
};

只是浏览器将事件参数命名为event.

因此,属性的值被包装在一个 JS 函数中,该函数接收一个名为的参数,该参数event是事件对象。

于 2009-10-02T15:10:10.127 回答
8

不,event不是保留字。然而,它是一个由所有主流浏览器在执行 DOM 节点的事件处理程序(例如 onkeypress)时设置的变量。在 IE 中,它也是一个全局变量。

获取事件的典型跨浏览器方式是沿着这些思路。

在 DOM 节点上:

<div onclick='someFunction(event)'>Click me</div>

事件处理函数:

function someFunction(evt) {
  var srcElem = evt.srcElement || evt.target;

  // Code continues
}

顺便说一句,在您的示例中,oEvent是参数的名称,因此在被调用函数的上下文中有效,而不是在调用者的上下文中。

于 2009-10-02T15:40:40.960 回答
5

javascript保留字列表

于 2009-10-02T15:06:08.220 回答
1

这是旧的,但由于我偶然发现它,我想我不妨回答一下。

http://www.w3schools.com/js/js_reserved.asp说该事件不是保留字,如上面的评论中所述。但是,如果您进一步阅读该页面......

“Windows 保留字 JavaScript 可以在 HTML 之外使用。它可以用作许多其他应用程序中的编程语言。

在 HTML 中,您必须(为了可移植性)避免使用 HTML 和 Windows 对象和属性的名称:"

并且“事件”显示在下表中。那你能用吗?当然。你应该使用它吗?不。stackoverflow 上有很多使用事件的示例,但为了清楚起见,他们使用它。当您使用该代码时,您需要对其进行编辑。

于 2015-11-13T00:52:17.630 回答