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" event
var 传递给你的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函数中,该函数接收名为event
event 的参数,该参数是事件对象.
不,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
是参数的名称,因此在被调用函数的上下文中有效,而不是在调用者的上下文中.
归档时间: |
|
查看次数: |
11301 次 |
最近记录: |