// 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>
Des questions similaires ont été posées.
Mais dans mon code, j'essaye d'obtenir des éléments enfants sur lesquels on a cliqué, comme a
ouspan
.
Alors, quelle est la bonne façon de passer event
comme argument au gestionnaire d'événements, ou comment obtenir un événement à l'intérieur du gestionnaire sans passer d'argument?
Éditer
Je suis au courant addEventListener
et jQuery
, veuillez fournir une solution pour passer un événement à un organisateur d' inline
événements.
javascript
events
inline
argument-passing
user1643156
la source
la source
Réponses:
pour passer l'
event
objet:pour obtenir l'enfant cliqué
element
(doit être utilisé avec leevent
paramètre:pour passer le
element
lui - même (DOMElement):voir l'exemple en direct sur jsFiddle
la source
event
objet global . C'est parce que le contexte dans lequel le gestionnaire DOM0 est appelé a unevent
objet , même si [sur certains navigateurs] ce n'est pas un global.)this
fait référence àp
, mais j'essaie d'obtenira
ouspan
Puisque les événements en ligne sont exécutés comme des fonctions, vous pouvez simplement utiliser des arguments .
et
L '«événement» mentionné dans la réponse acceptée est en fait le nom de l'argument passé à la fonction. Cela n'a rien à voir avec l'événement mondial.
la source
call()
etapply()
se révéleront essentiels pour émuler les capacités de liaison de données disponibles dans les frameworks js traditionnels. Une astuce supplémentaire consiste à faire quelque chose de similaire à l'Object.assign(this.querySelector('my-btn'), this)
intérieur d'un composant Web et voila, la liaison de données. Vous pouvez accéder à n'importe quelle méthode de la classe de composant Web parent à partir des événements en ligneonclick="toggleBtnActive.call(this, true)"
.Vous n'avez pas besoin de passer
this
, il y a déjà l'event
objet passé par défaut automatiquement, qui contient deevent.target
quel objet il provient. Vous pouvez alléger votre syntaxe:Ce:
Fonctionnera avec ceci:
Vous n'avez pas besoin d'instancier l'
event
objet, il est déjà là. Essaye le. Etevent.target
contiendra l'objet entier l'appelant, auquel vous faisiez référence auparavant comme "ceci".Maintenant, si vous déclenchez dynamiquement doSomething () à partir de quelque part dans votre code, vous remarquerez que ce
event
n'est pas défini. C'est parce qu'il n'a pas été déclenché par un événement de clic. Donc, si vous souhaitez toujours déclencher artificiellement l'événement, utilisez simplementdispatchEvent
:Puis
doSomething()
verraevent
etevent.target
comme d'habitude!Pas besoin de passer
this
partout, vous pouvez garder vos signatures de fonction exemptes d'informations de câblage et simplifier les choses.la source