// this e works
document.getElementById("p").oncontextmenu = function(e) {
e = e || window.event;
var target = e.target || e.srcElement;
console.log(target);
};
// this e is undefined
function doSomething(e) {
e = e || window.event;
var target = e.target || e.srcElement;
console.log(target);
}
<p id="p" onclick="doSomething(e)">
<a href="#">foo</a>
<span>bar</span>
</p>
Se han hecho algunas preguntas similares.
Pero en mi código, estoy tratando de obtener elementos secundarios en los que se haya hecho clic, como a
ospan
.
Entonces, ¿cuál es la forma correcta de pasar event
como argumento al controlador de eventos, o cómo obtener el evento dentro del controlador sin pasar un argumento?
editar
Soy consciente de addEventListener
y jQuery
, por favor, proporcione una solución para pasar de un evento a otro inline
.
javascript
events
inline
argument-passing
user1643156
fuente
fuente
Respuestas:
para pasar el
event
objeto:para obtener el niño en el que se hizo clic
element
(debe usarse con elevent
parámetro:para pasar el
element
mismo (DOMElement):ver ejemplo en vivo en jsFiddle
fuente
event
objeto global . Es porque el contexto en el que se llama al controlador DOM0 tiene unevent
objeto , incluso si [en algunos navegadores] no es global.)this
hace referenciap
, pero estoy tratando de obtenera
ospan
Dado que los eventos en línea se ejecutan como funciones, simplemente puede usar argumentos .
y
El 'evento' que se menciona en la respuesta aceptada es en realidad el nombre del argumento pasado a la función. No tiene nada que ver con el evento global.
fuente
call()
yapply()
serán esenciales para emular las capacidades de enlace de datos disponibles en los marcos js convencionales. Un truco adicional es hacer algo similar aObject.assign(this.querySelector('my-btn'), this)
dentro de un componente web y listo, enlace de datos. Puede acceder a cualquier método de la clase de componente web principal desde los eventos en líneaonclick="toggleBtnActive.call(this, true)"
.No necesita pasar
this
, ya existe elevent
objeto pasado automáticamente por defecto, que contieneevent.target
cuál tiene el objeto del que proviene. Puedes aligerar tu sintaxis:Esta:
Trabajará con esto:
No es necesario crear una instancia del
event
objeto, ya está allí. Pruébalo. Yevent.target
contendrá todo el objeto que lo llama, al que antes se refería como "esto".Ahora, si activa dinámicamente doSomething () desde algún lugar de su código, notará que
event
no está definido. Esto se debe a que no se activó por un evento de clic. Entonces, si aún desea activar artificialmente el evento, simplemente usedispatchEvent
:Luego
doSomething()
veremosevent
yevent.target
como de costumbre!No es necesario pasar a
this
todas partes, y puede mantener sus firmas de funciones libres de información de cableado y simplificar las cosas.fuente