// 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 aospan .
Entonces, ¿cuál es la forma correcta de pasar eventcomo argumento al controlador de eventos, o cómo obtener el evento dentro del controlador sin pasar un argumento?
editar
Soy consciente de addEventListenery 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
eventobjeto:para obtener el niño en el que se hizo clic
element(debe usarse con eleventparámetro:para pasar el
elementmismo (DOMElement):ver ejemplo en vivo en jsFiddle
fuente
eventobjeto global . Es porque el contexto en el que se llama al controlador DOM0 tiene uneventobjeto , incluso si [en algunos navegadores] no es global.)thishace referenciap, pero estoy tratando de obteneraospanDado 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 eleventobjeto pasado automáticamente por defecto, que contieneevent.targetcuál tiene el objeto del que proviene. Puedes aligerar tu sintaxis:Esta:
Trabajará con esto:
No es necesario crear una instancia del
eventobjeto, ya está allí. Pruébalo. Yevent.targetcontendrá 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
eventno 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()veremoseventyevent.targetcomo de costumbre!No es necesario pasar a
thistodas partes, y puede mantener sus firmas de funciones libres de información de cableado y simplificar las cosas.fuente