// 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>
Algumas perguntas semelhantes foram feitas.
Mas em meu código, estou tentando obter elementos filhos que foram clicados, como a
ouspan
.
Então, qual é a maneira correta de passar event
como um argumento para o manipulador de eventos ou como obter o evento dentro do manipulador sem passar um argumento?
editar
Estou ciente addEventListener
e jQuery
forneça uma solução para passar o evento ao inline
manipulador de eventos.
javascript
events
inline
argument-passing
user1643156
fonte
fonte
Respostas:
para passar o
event
objeto:para obter o filho clicado
element
(deve ser usado com oevent
parâmetro:para passar o
element
próprio (DOMElement):veja o exemplo ao vivo no jsFiddle
fonte
event
objeto global . É porque o contexto no qual o manipulador DOM0 é chamado tem umevent
objeto , mesmo que [em alguns navegadores] não seja global.)this
refere-se ap
, mas estou tentando obtera
ouspan
Como os eventos inline são executados como funções, você pode simplesmente usar argumentos .
e
O 'evento' mencionado na resposta aceita é, na verdade, o nome do argumento passado para a função. Não tem nada a ver com o evento global.
fonte
call()
eapply()
se provarão essenciais na emulação de recursos de vinculação de dados disponíveis em estruturas js convencionais. Um truque extra é fazer algo semelhante aObject.assign(this.querySelector('my-btn'), this)
dentro de um componente da web e voila, vinculação de dados. Você pode acessar qualquer método da classe do componente da web pai a partir dos eventos embutidosonclick="toggleBtnActive.call(this, true)"
.Você não precisa passar
this
, já existe oevent
objeto passado por padrão automaticamente, que contémevent.target
o objeto de onde está vindo. Você pode aliviar sua sintaxe:Este:
Irá funcionar com isto:
Você não precisa instanciar o
event
objeto, ele já está lá. Experimente. Eevent.target
conterá todo o objeto que o chama, ao qual você se referia como "this" antes.Agora, se você acionar doSomething () dinamicamente de algum lugar em seu código, notará que
event
é indefinido. Isso ocorre porque ele não foi acionado a partir de um evento de clique. Portanto, se você ainda deseja acionar artificialmente o evento, basta usardispatchEvent
:Então
doSomething()
vai verevent
eevent.target
como de costume!Não há necessidade de passar por
this
todos os lugares, e você pode manter suas assinaturas de funções livres de informações de fiação e simplificar as coisas.fonte