我是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'未定义”
但如果我用'event'重命名oEvent,如:
<input type="text" id="txtTextBox" onkeypress="return showChar('some text', event);" />
然后它工作正常。我的结论是'事件'是一个代表事件的保留词 Java Script中的参数。但是当我检查网时,我并没有将“事件”视为保留字。
我错了,或者它没有真正记录为保留字?
谢谢!
答案 0 :(得分:28)
它不是保留关键字,但它至少是IE中的全局变量。
答案 1 :(得分:22)
最初让我感到困惑的是,不了解编码事件处理程序的约定实际上是如何工作的,而命名变量是什么,并结合了由设置这样的事件处理程序时的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
被用作全局的方式,像这样的肮脏代码也有效:
Cruddy范围1
document.getElementById('testId').onkeypress = function(aWhopBopALuWhop) {
console.log(event.which); // <<< decidedly NOT aWhopBopALuWhop
}
所以你可能还会看到像这样的双重代码:
Cruddy Scoping 2
document.getElementById('testId').onkeypress = function(event) {
console.log(event.which);
}
现在哪event
是event
?不幸的是,没关系。无论范围如何,我们都将event
放入event
,以便event
=== event
! [原文]
但这确实表明event
不是保留字。这是一个变量。所以,你不能说break = "spam";
,可以说event = "spam";
。因此,如果您尝试使用<{1>},其中 保留,则会发生错误。
break
重要的是要学习(以及Ionut is essentially saying, I believe),您的浏览器是将“全局”document.getElementById('testId').onkeypress = function(break) {
console.log(break.which);
}
var静默传递到您的event
处理程序中无论你在函数定义中称之为什么。令人困惑的是,即使您没有使用参数访问处理程序中的onkeypress
,您仍然可以访问event
作为全局,如 Cruddy 1&amp; 2 ,上面。
现在,当我从html-land打电话event
时,范式开始在我脑海中混合。这里,onkeypress
没有静默传递到你的处理函数的参数中。您必须自己明确传递event
,如下所示:
event
没有其他约定可以使用!这只会起作用,因为浏览器支持它,而不是因为任何ECMAscript标准定义<script>
function handlerNamed(namedParam) {
console.log(namedParam.which);
}
</script>
<input type="text" size="10" onkeypress="handlerNamed(event)"><br />
(afaik)。您不能使用.onKeyPress,通过更改event
中匹配的参数名称来使用以下任何内容:
handlerNamed
有意义吗?我正处于a much too complicated jsFiddle的中间,试图在它最终点击之前写下来以防有用。
答案 2 :(得分:10)
嗯,代码:
onkeypress="return showChar('some text', oEvent);"
是否等效于以下JavaScript代码:
element.onkeypress = function (eventObjectName) {
return showChar('some text', eventObjectName);
};
只是浏览器将事件参数命名为event
。
因此,属性的值包含在JS函数中,该函数接收名为event
的参数,该参数是事件对象。
答案 3 :(得分:6)
不,event
不是保留字。但是,它是一个变量,它是在执行DOM节点的事件处理程序(例如onkeypress)时由所有主要浏览器设置的。在IE中,它也是一个全局变量。
获得此事件的典型跨浏览器方式就是这些。
在DOM节点上:
<div onclick='someFunction(event)'>Click me</div>
事件处理功能:
function someFunction(evt) {
var srcElem = evt.srcElement || evt.target;
// Code continues
}
顺便说一句,在您的示例中,oEvent
是参数的名称,因此在被调用函数的上下文中有效,而不是在调用者的上下文中。
答案 4 :(得分:5)
答案 5 :(得分:0)
这是旧的,但是因为我偶然发现它,我想我也可以回答。
http://www.w3schools.com/js/js_reserved.asp表示该事件不是保留字,如上面的评论所述。但是,如果您在页面下方进一步阅读....
&#34; Windows保留字 JavaScript可以在HTML之外使用。它可以在许多其他应用程序中用作编程语言。
在HTML中,你必须(为了便携性)避免使用HTML和Windows对象和属性的名称:&#34;
并且&#39;事件&#39;显示在下表中。你可以用它吗?当然。你应该用吗?不是。在stackoverflow上有大量使用事件的示例,但为了清晰起见,他们正在使用它。使用该代码时,需要对其进行编辑。