Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как в обработчике событий отсеивать собития, пришедшие по всплыванию от дочек? (https://javascript.ru/forum/misc/5682-kak-v-obrabotchike-sobytijj-otseivat-sobitiya-prishedshie-po-vsplyvaniyu-ot-dochek.html)

Nominus umbra 30.10.2009 15:18

Как в обработчике событий отсеивать собития, пришедшие по всплыванию от дочек?
 
Задача простая - вешаю событие на элемент, у которого есть дочки.
Например, на mousemove.
Но это событие по всплыванию будет приходить при перемещении мыши ВНУТРИ самого себя - при переходах между потомками.
Но мне это категорически не надо, мне надо чтобы событие, вне зависимости от того, сколько у него потомков, пришло только один раз.

Я использую синглтон Event с этого сайта для добавления событий.

Придумал такое: в обработчике проверять, являются ли event.target и
event.relatedTarget потомками моего родителя (или им самим), и если они оба ими являются - то игнорировать событие, иначе - реагировать.

Является ли такое решение корректным? Нет ли проще пути?

Kolyaj 30.10.2009 15:20

Просто проверять, является ли event.target нужным элементом.

Nominus umbra 30.10.2009 17:18

event.target не всегда будет нужным элементом
Вы можете переместить мышь так, что event.target - будет сразу потомком.

Kolyaj 30.10.2009 17:43

Цитата:

Сообщение от Nominus umbra
event.target не всегда будет нужным элементом

Так я и сказал, проверять, нужный ли он, и, в зависимости от этого, делать/не делать что-то.

Nominus umbra 30.10.2009 18:14

Да, но событие всё равно нужно инициировать...
Задачу уточню: есть див, в нём ещё куча элементов, на него навешено событие mousemove.
Оно должно сработать только ОДИН раз, и неважно, переместили мышь непосредственно на него или на его содержимое.
Если я буду анализировать event.target - то при перемещении мыша внутрь, и если он попадёт на потомка дива, событие просто не возникнет.
А ето неверно.
Мне нужно, чтобы независимо от содержимого дива, событие mousemove - обязательно было вызвано для родителя, и только один раз.

Kolyaj 30.10.2009 20:17

Цитата:

Сообщение от Nominus umbra
Мне нужно, чтобы независимо от содержимого дива, событие mousemove - обязательно было вызвано для родителя, и только один раз.

Это невозможно.

Nominus umbra 30.10.2009 23:22

Почему? Я сейчас сделал так вот:
// Проверка объекта на принадлежность родителю
function isParented(obj, parent) {
  if(obj === parent) return true
  if(!obj) return false
  return isParented(obj.parentNode, parent)
}

function handleEvents(event) {
  // Если событие внутреннее, выходим
  if(isParented(event.target, this) == isParented(event.relatedTarget, this)) return
  ...

Вроде работает. Я просто недавно JS изучаю, может, есть более элегантный и корректный способ? Или как я написал - есть какая-то засада?

Octane 30.10.2009 23:48

relatedTarget в IE нет

Nominus umbra 30.10.2009 23:53

Я в первом посте указал, что использую синглтон Event с этого сайта для добавления событий. В нём есть "патч" для IE, так что relatedTarget есть.


Часовой пояс GMT +3, время: 11:52.