30.10.2009, 15:18
|
Интересующийся
|
|
Регистрация: 29.10.2009
Сообщений: 19
|
|
Как в обработчике событий отсеивать собития, пришедшие по всплыванию от дочек?
Задача простая - вешаю событие на элемент, у которого есть дочки.
Например, на mousemove.
Но это событие по всплыванию будет приходить при перемещении мыши ВНУТРИ самого себя - при переходах между потомками.
Но мне это категорически не надо, мне надо чтобы событие, вне зависимости от того, сколько у него потомков, пришло только один раз.
Я использую синглтон Event с этого сайта для добавления событий.
Придумал такое: в обработчике проверять, являются ли event.target и
event.relatedTarget потомками моего родителя (или им самим), и если они оба ими являются - то игнорировать событие, иначе - реагировать.
Является ли такое решение корректным? Нет ли проще пути?
|
|
30.10.2009, 15:20
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Просто проверять, является ли event.target нужным элементом.
|
|
30.10.2009, 17:18
|
Интересующийся
|
|
Регистрация: 29.10.2009
Сообщений: 19
|
|
event.target не всегда будет нужным элементом
Вы можете переместить мышь так, что event.target - будет сразу потомком.
|
|
30.10.2009, 17:43
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Сообщение от Nominus umbra
|
event.target не всегда будет нужным элементом
|
Так я и сказал, проверять, нужный ли он, и, в зависимости от этого, делать/не делать что-то.
|
|
30.10.2009, 18:14
|
Интересующийся
|
|
Регистрация: 29.10.2009
Сообщений: 19
|
|
Да, но событие всё равно нужно инициировать...
Задачу уточню: есть див, в нём ещё куча элементов, на него навешено событие mousemove.
Оно должно сработать только ОДИН раз, и неважно, переместили мышь непосредственно на него или на его содержимое.
Если я буду анализировать event.target - то при перемещении мыша внутрь, и если он попадёт на потомка дива, событие просто не возникнет.
А ето неверно.
Мне нужно, чтобы независимо от содержимого дива, событие mousemove - обязательно было вызвано для родителя, и только один раз.
|
|
30.10.2009, 20:17
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Сообщение от Nominus umbra
|
Мне нужно, чтобы независимо от содержимого дива, событие mousemove - обязательно было вызвано для родителя, и только один раз.
|
Это невозможно.
|
|
30.10.2009, 23:22
|
Интересующийся
|
|
Регистрация: 29.10.2009
Сообщений: 19
|
|
Почему? Я сейчас сделал так вот:
// Проверка объекта на принадлежность родителю
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 изучаю, может, есть более элегантный и корректный способ? Или как я написал - есть какая-то засада?
|
|
30.10.2009, 23:48
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
relatedTarget в IE нет
|
|
30.10.2009, 23:53
|
Интересующийся
|
|
Регистрация: 29.10.2009
Сообщений: 19
|
|
Я в первом посте указал, что использую синглтон Event с этого сайта для добавления событий. В нём есть "патч" для IE, так что relatedTarget есть.
|
|
|
|