最初让我感到困惑的是,不了解编码事件处理程序的约定与命名变量的实际工作方式,以及设置事件处理程序时 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
都使用event
so 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中间,试图在它最终点击之前将其写出来,以防万一。