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中的事件参数.但是当我检查网时,我没有看到"事件"是一个保留字.
我错了还是没有真正记录为保留字?
谢谢!
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?不幸的是,没关系.无论作用域的,我们把event成event这样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 的参数,该参数是事件对象.
不,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是参数的名称,因此在被调用函数的上下文中有效,而不是在调用者的上下文中.