"事件"是JavaScript中的保留字吗?

pen*_*ake 30 javascript events reserved-words

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

采取这个功能:

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

</script>
Run Code Online (Sandbox Code Playgroud)

当我将此函数称为:

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

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

但如果我用'event'重命名oEvent,如:

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

然后它工作正常.我的结论是'event'是一个保留字,代表Java Script中的事件参数.但是当我检查网时,我没有看到"事件"是一个保留字.

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

谢谢!

Loc*_*ree 30

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

  • 您的问题不是名称,而是事件属性的工作方式.请参阅下面的Ionut答案(应该对其进行投票). (2认同)

ruf*_*fin 24

最初让我感到困惑的是,不了解编码事件处理程序的约定实际上如何工作而不是命名变量,并结合Javascript处理程序在设置这样的事件处理程序时执行的隐式调用:

好1

document.getElementById('testId').onkeypress = function(e) {
     console.log(e.which);
}
Run Code Online (Sandbox Code Playgroud)

在上面,你的浏览器event隐式地传递给处理程序作为函数的第一个参数,所以你可以命名你的参数(这里,e)你想要的任何东西,只要你是一致的,即使你像这样发疯:

好2; 创造性地命名

document.getElementById('testId').onkeypress = function(aWhopBopALuWhop) {
     console.log(aWhopBopALuWhop.which);
}
Run Code Online (Sandbox Code Playgroud)

但由于这种方式event被用作全局,这样的肮脏代码也有效:

肮脏的范围1

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

所以你可能也会看到像这样的双重代码:

肮脏的范围2

document.getElementById('testId').onkeypress = function(event) {
     console.log(event.which);
}
Run Code Online (Sandbox Code Playgroud)

现在event是哪个event?不幸的是,没关系.无论作用域的,我们把eventevent这样event=== event惠顾![原文如此]

但这确实表明这event 不是一个保留的词.这是一个变量.所以你不能说break = "spam";,你可以event = "spam";.因此,如果你试图使用break,这保留,它borks.

document.getElementById('testId').onkeypress = function(break) {
     console.log(break.which);
}
Run Code Online (Sandbox Code Playgroud)

重要的是要学习(以及Ionut基本上所说的,我相信),无论你在函数定义中将它称为什么,你的浏览器都会默默地将"global" eventvar 传递给你的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 />
Run Code Online (Sandbox Code Playgroud)

没有其他会议有效! 这只能起作用,因为浏览器支持它,而不是因为任何ECMAscript标准定义event(afaik).您不能像使用.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 />
Run Code Online (Sandbox Code Playgroud)

合理?我正处于一个太复杂的jsFiddle的中间,试图在它最终点击之前写下来,以防有用.


Ion*_*tan 10

嗯,代码:

onkeypress="return showChar('some text', oEvent);"
Run Code Online (Sandbox Code Playgroud)

是否等效于以下JavaScript代码:

element.onkeypress = function (eventObjectName) {
    return showChar('some text', eventObjectName);
};
Run Code Online (Sandbox Code Playgroud)

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

因此,属性的值包含在JS函数中,该函数接收名为eventevent 的参数,该参数是事件对象.

  • @outis,但是`oEvent`在你的例子中将是'undefined`. (3认同)

jhu*_*man 7

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

一种典型的跨浏览器方式来获取事件就是这样.

在DOM节点上:

<div onclick='someFunction(event)'>Click me</div>
Run Code Online (Sandbox Code Playgroud)

事件处理功能:

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

  // Code continues
}
Run Code Online (Sandbox Code Playgroud)

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


Ste*_*ike 5

javascript保留字列表

  • 链接到的文档不包含“事件”,因此我认为说“事件不是保留字”会很有用,而不仅仅是发布 URL。 (2认同)