// 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>
Es wurden einige ähnliche Fragen gestellt.
Aber in meinem Code versuche ich, untergeordnete Elemente zu erhalten, auf die geklickt wurde, wie a
oderspan
.
Was ist also der richtige Weg, um event
ein Argument an den Ereignishandler zu übergeben, oder wie kann ein Ereignis in den Handler übernommen werden, ohne ein Argument zu übergeben?
bearbeiten
Ich bin mir bewusst addEventListener
und jQuery
bitte geben Sie eine Lösung für die Weitergabe von Event an inline
Event Hander.
javascript
events
inline
argument-passing
user1643156
quelle
quelle
Antworten:
um das
event
Objekt zu übergeben:um das angeklickte Kind zu erhalten
element
(sollte mit folgendenevent
Parametern verwendet werden:sich
element
selbst übergeben (DOMElement):siehe Live-Beispiel auf jsFiddle
quelle
event
Objekt haben. Dies liegt daran, dass der Kontext, in dem der DOM0-Handler aufgerufen wird, einevent
Objekt enthält , auch wenn [in einigen Browsern] es nicht global ist.)this
bezieht sich aufp
, aber ich versuche zu bekommena
oderspan
Da Inline-Ereignisse als Funktionen ausgeführt werden, können Sie einfach Argumente verwenden .
und
Das 'Ereignis', das in der akzeptierten Antwort erwähnt wird, ist tatsächlich der Name des an die Funktion übergebenen Arguments. Es hat nichts mit dem globalen Ereignis zu tun.
quelle
call()
undapply()
sich als wesentlich für die Emulation von Datenbindungsfunktionen erweisen, die in den gängigen JS-Frameworks verfügbar sind. Ein zusätzlicher Trick besteht darin, etwas Ähnliches wieObject.assign(this.querySelector('my-btn'), this)
in einer Webkomponente und voila, Datenbindung, zu tun . Sie können über die Inline-Ereignisse auf jede Methode der übergeordneten Webkomponentenklasse zugreifenonclick="toggleBtnActive.call(this, true)"
.Sie müssen nicht übergeben
this
, es gibt bereits dasevent
Objekt, das standardmäßig automatisch übergeben wird und dasevent.target
das Objekt enthält , von dem es stammt. Sie können Ihre Syntax vereinfachen:Dies:
Wird damit funktionieren:
Sie müssen das
event
Objekt nicht instanziieren , es ist bereits vorhanden. Versuch es. Undevent.target
enthält das gesamte Objekt, das es aufruft und das Sie zuvor als "dies" bezeichnet haben.Wenn Sie nun dynamisch doSomething () von irgendwo in Ihrem Code auslösen, werden Sie feststellen, dass dies nicht
event
definiert ist. Dies liegt daran, dass es nicht durch ein Ereignis des Klickens ausgelöst wurde. Wenn Sie das Ereignis dennoch künstlich auslösen möchten, verwenden Sie einfachdispatchEvent
:Dann
doSomething()
sehenevent
undevent.target
wie gewohnt!Sie müssen nicht
this
überall vorbeikommen , und Sie können Ihre Funktionssignaturen frei von Verdrahtungsinformationen halten und die Dinge vereinfachen.quelle