Как стать автором
Обновить

Комментарии 2

можно твердо утверждать, что если событие пользовательского интерфейса вызвано не искусственно (является isTrusted), то target будет являться как минимум Node. Если же искусственно, то оно будет идентично currentTarget. (просьба поправить (ну или привести пример, доказывающий обратное), если в этих рассуждениях есть прокол).

Напомню что target - это изначальный источник события, а currentTarget - текущий. Разница между ними в том, что тот же click мог быть инициирован на одном из вложенных элементов, а обрабатывать его мы можем гораздо выше по дереву. Такой сценарий никоим образом отработать на уровне типов не получится, поэтому мы можем быть точно уверены только в типе curentTarget (как сделано например и в реакте).

Все так. Однако есть некоторая закономерность, на примере того же клика: если click вызван искусственно (через dispatchEvent), то target эвента всегда равен currentTarget (иными словами, если эвент вызван window.dispatchEvent(...), то егоtarget - это всегда объект Window, если new EventTarget().dispatchEvent(...) , то target - это всегда EventTarget, и так далее). Если же он вызван нативно (кликом пользователя), то в иерархии наследования типов target будет как минимум объектом, наследованным отElement ( HTMLElement, SVGElement и тому подобное).

При чем искусственно вызванноеnew MouseEvent('click') на голом EventTarget никогда не всплывет ни до Window , ни до какого другого элемента (что логично и не требует объяснений). А вот оно же вызванное на Node, добавленной в document, уже может. Таким образом мы имеет, что в прослушиватель события пользовательского интерфейса, вызванного на каком-либо элементе, прилетит target, унаследованный как минимум от Node. Вызванного на Window - это Window либо [объект,] унаследованный как минимум от Node, в Document - это Document либо [объект,] унаследованный как минимум от Node. На мой взгляд, понимание этого может сделать код более типобезопасным.

PS: поправьте меня, если в моих рассуждениях есть какая-то червоточина

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории