ejemplos - palabras reservadas javascript
¿Es ''evento'' una palabra reservada en JavaScript? (6)
Soy un principiante de Javascript. Y cuando estaba practicando, noté algo.
Toma esta función:
<script type="text/javascript">
function showChar(sSomeData, oEvent)
{
alert (oEvent.keyCode);
return true;
}
</script>
Cuando llamo a esta función como esta:
<input type="text" id="txtTextBox" onkeypress="return showChar(''some text'', oEvent);" />
Aparece un error de JS: "Error de tiempo de ejecución de Microsoft JScript: ''oEvent'' no está definido"
Pero si renombro oEvent con ''evento'' como:
<input type="text" id="txtTextBox" onkeypress="return showChar(''some text'', event);" />
Entonces funciona bien. Mi conclusión es ''evento'' es una palabra reservada que significa argumento de evento en Java Script. Pero cuando revisé la red, no vi ''evento'' como una palabra reservada.
¿Estoy equivocado o no está realmente documentado como una palabra reservada?
¡Gracias!
Bueno, el código:
onkeypress="return showChar(''some text'', oEvent);"
Es el equivalente del siguiente código JavaScript:
element.onkeypress = function (eventObjectName) {
return showChar(''some text'', eventObjectName);
};
Es solo que los navegadores nombran el argumento del event
como event
.
Entonces, el valor del atributo se envuelve en una función JS que recibe un argumento llamado event
que es el objeto del evento.
Esto es viejo, pero desde que tropecé con él creo que también podría responder.
http://www.w3schools.com/js/js_reserved.asp dice que el evento NO es una palabra reservada, como se menciona en los comentarios anteriores. Sin embargo, si lee más abajo en la página ...
"Palabras reservadas de Windows JavaScript se puede usar fuera de HTML. Se puede usar como el lenguaje de programación en muchas otras aplicaciones.
En HTML, debe (por razones de portabilidad) evitar el uso del nombre de objetos y propiedades de HTML y Windows: "
Y ''evento'' se muestra en la tabla a continuación. Entonces, ¿puedes usarlo? Por supuesto. ¿Deberías usarlo? No. Hay montones de ejemplos en que usan eventos, pero lo están usando para mayor claridad. Cuando usa ese código, necesita editarlo.
Lo que inicialmente me hizo confuso es no entender cómo funcionaban las convenciones para codificar manejadores de eventos en comparación con lo que era una variable nombrada , combinadas con las llamadas implícitas hechas por los manejadores de Javascript cuando configura manejadores de eventos como este:
Bueno 1
document.getElementById(''testId'').onkeypress = function(e) {
console.log(e.which);
}
Arriba, su navegador está pasando event
al manejador como el primer argumento de la función implícitamente, por lo que puede asignarle un nombre al parámetro (aquí, e
) cualquier cosa que quiera, siempre y cuando sea consistente , incluso si se vuelve loco así:
Bueno 2; nombre creativo
document.getElementById(''testId'').onkeypress = function(aWhopBopALuWhop) {
console.log(aWhopBopALuWhop.which);
}
Pero debido a la forma en event
se usa el event
como un código cruddy global como este también funciona:
Cruddy scoping 1
document.getElementById(''testId'').onkeypress = function(aWhopBopALuWhop) {
console.log(event.which); // <<< decidedly NOT aWhopBopALuWhop
}
Así que también puedes ver un código doblemente cruddy como este:
Cruddy Scoping 2
document.getElementById(''testId'').onkeypress = function(event) {
console.log(event.which);
}
Ahora, ¿qué event
es event
? Lamentablemente, no importa. ¡Independientemente del alcance, ponemos el event
en event
para que event
=== event
largo! [sic]
Pero esto demuestra que el event
no es una palabra reservada. Es una variable. Entonces, donde no se puede decir break = "spam";
, puedes decir event = "spam";
. Entonces, si intentas usar break
, que está reservado, se borks.
document.getElementById(''testId'').onkeypress = function(break) {
console.log(break.which);
}
Lo que es importante aprender (y lo que Ionut dice esencialmente, creo ) es que su navegador está pasando silenciosamente el event
"global" var a su controlador onkeypress
sin importar cómo lo llame en la definición de su función. Confusamente, incluso si no usa su parámetro para acceder al event
dentro de su controlador, aún puede acceder al event
como global, como se muestra en Cruddy 1 y 2 , más arriba.
Ahora, cuando estaba llamando desde html-land con una onkeypress
, los paradigmas comenzaron a mezclarse en mi cabeza. Aquí, no hay un paso silencioso del event
en los argumentos de la función del manejador. Tienes que pasar el event
explícitamente, así:
<script>
function handlerNamed(namedParam) {
console.log(namedParam.which);
}
</script>
<input type="text" size="10" onkeypress="handlerNamed(event)"><br />
¡Ninguna otra convención funciona! Y esto solo funciona porque los navegadores lo admiten, no porque ningún estándar de ECMAscript defina el event
(afaik). No puede usar ninguno de los siguientes como "podría" con .onKeyPress cambiando el nombre del parámetro para que coincida en 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 />
¿Tener sentido? Estaba en medio de un jsFiddle demasiado complicado tratando de escribir esto antes de que finalmente hiciera clic en caso de que fuera útil.
No es una palabra clave reservada, pero es una variable global en IE al menos.
No, el event
no es una palabra reservada. Sin embargo, es una variable establecida por todos los principales navegadores cuando se está ejecutando un controlador de eventos (como onkeypress) de un nodo DOM. En IE, también es una variable global.
Una forma típica de navegador cruzado para obtener el evento es a lo largo de estas líneas.
En el nodo DOM:
<div onclick=''someFunction(event)''>Click me</div>
La función de manejo de eventos:
function someFunction(evt) {
var srcElem = evt.srcElement || evt.target;
// Code continues
}
Por cierto, en su ejemplo, oEvent
es el nombre del parámetro y, por lo tanto, es válido en el contexto de la función a la que se llama, no en el contexto de la persona que llama.