// 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>
Было задано несколько подобных вопросов.
Но в моем коде я пытаюсь получить дочерние элементы, на которые нажимали, например a
илиspan
.
Итак, как правильно передать event
в качестве аргумента обработчик событий или как получить событие внутри обработчика без передачи аргумента?
редактировать
Я знаю об этом addEventListener
и jQuery
, пожалуйста, предоставьте решение для передачи inline
события обработчику события.
javascript
events
inline
argument-passing
user1643156
источник
источник
Ответы:
передать
event
объект:чтобы получить дочерний
element
элемент, по которому щелкнули (следует использовать сevent
параметром:передать
element
сам (DOMElement):см. живой пример на jsFiddle
источник
event
объекта. Это потому, что контекст, в котором вызывается обработчик DOM0, имеетevent
объект , даже если [в некоторых браузерах] это не глобально.)this
относитсяp
, но я пытаюсь получитьa
илиspan
Поскольку встроенные события выполняются как функции, вы можете просто использовать аргументы .
и
«Событие», упомянутое в принятом ответе, на самом деле является именем аргумента, переданного функции. Это не имеет ничего общего с глобальным событием.
источник
call()
иapply()
окажутся необходимыми для имитации возможностей привязки данных, доступных в основных js-фреймворках. Еще одна уловка - сделать что-то подобноеObject.assign(this.querySelector('my-btn'), this)
внутри веб-компонента и вуаля, привязка данных. Вы можете получить доступ к любому методу родительского класса веб-компонента из встроенных событийonclick="toggleBtnActive.call(this, true)"
.Вам не нужно передавать
this
, уже естьevent
объект, переданный по умолчанию автоматически, который содержитevent.target
объект, из которого он исходит. Вы можете облегчить свой синтаксис:Это:
Будет работать с этим:
Вам не нужно создавать экземпляр
event
объекта, он уже существует. Попробуйте сами. Иevent.target
будет содержать весь вызывающий его объект, на который вы раньше ссылались как на «это».Теперь, если вы динамически запускаете doSomething () откуда-то в своем коде, вы заметите, что
event
это undefined. Это потому, что он не был вызван событием щелчка. Поэтому, если вы все еще хотите искусственно вызвать событие, просто используйтеdispatchEvent
:Тогда
doSomething()
увидимevent
иevent.target
как обычно!Нет необходимости проходить
this
везде, и вы можете избавить свои сигнатуры функций от информации о связях и упростить вещи.источник