// 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>
Zadano kilka podobnych pytań.
Ale w moim kodzie próbuję uzyskać elementy podrzędne, które zostały kliknięte, takie jak a
lubspan
.
Jaki jest więc prawidłowy sposób przekazywania event
jako argumentu do programu obsługi zdarzeń lub jak uzyskać zdarzenie wewnątrz modułu obsługi bez przekazywania argumentu?
edytować
Jestem tego świadomy addEventListener
i jQuery
proszę o podanie rozwiązania umożliwiającego przekazanie inline
zdarzenia osobie obsługującej wydarzenie.
javascript
events
inline
argument-passing
user1643156
źródło
źródło
Odpowiedzi:
przekazać
event
obiekt:<p id="p" onclick="doSomething(event)">
aby uzyskać kliknięte dziecko
element
(należy użyć zevent
parametrem:function doSomething(e) { e = e || window.event; var target = e.target || e.srcElement; console.log(target); }
przekazać
element
siebie (DOMElement):<p id="p" onclick="doThing(this)">
zobacz przykład na żywo na jsFiddle
źródło
event
obiektu globalnego . Dzieje się tak, ponieważ kontekst, w którym wywoływana jest procedura obsługi DOM0, maevent
obiekt , nawet jeśli [w niektórych przeglądarkach] nie jest globalny.)this
odnosi się dop
, ale próbuję uzyskaća
lubspan
Ponieważ zdarzenia inline są wykonywane jako funkcje, możesz po prostu użyć argumentów .
<p id="p" onclick="doSomething.apply(this, arguments)">
i
function doSomething(e) { if (!e) e = window.event; // 'e' is the event. // 'this' is the P element }
„Zdarzenie”, o którym mowa w zaakceptowanej odpowiedzi, jest w rzeczywistości nazwą argumentu przekazanego do funkcji. Nie ma to nic wspólnego z wydarzeniem globalnym.
źródło
call()
iapply()
okażą się niezbędni w emulowaniu możliwości wiązania danych dostępnych w głównych frameworkach js. Dodatkową sztuczką jest zrobienie czegoś podobnego doObject.assign(this.querySelector('my-btn'), this)
wewnątrz komponentu WWW i voila, powiązanie danych. Możesz uzyskać dostęp do dowolnej metody nadrzędnej klasy komponentu WWW ze zdarzeń wbudowanychonclick="toggleBtnActive.call(this, true)"
.Nie musisz przekazywać
this
, istnieje jużevent
obiekt przekazywany domyślnie automatycznie, który zawieraevent.target
obiekt, z którego pochodzi. Możesz rozjaśnić swoją składnię:To:
<p onclick="doSomething()">
Będzie działać z tym:
function doSomething(){ console.log(event); console.log(event.target); }
Nie musisz tworzyć instancji
event
obiektu, on już tam jest. Wypróbuj to. Ievent.target
będzie zawierał cały obiekt, który go wywołuje, do którego wcześniej odwoływałeś się jako „this”.Teraz, jeśli dynamicznie uruchomisz metodę doSomething () z dowolnego miejsca w kodzie, zauważysz, że
event
jest to niezdefiniowane. Dzieje się tak, ponieważ nie został wywołany przez kliknięcie. Jeśli więc nadal chcesz sztucznie wywołać zdarzenie, po prostu użyjdispatchEvent
:document.getElementById('element').dispatchEvent(new CustomEvent("click", {'bubbles': true}));
Wtedy
doSomething()
zobaczyevent
ievent.target
jak zwykle!Nie ma potrzeby przechodzenia
this
wszędzie, a sygnatury funkcji mogą być wolne od informacji o okablowaniu i upraszczać.źródło