Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > подавить onmouseout


Автор: Serge2k 18.1.2007, 12:39
Всем привет. я конечно повторюсь, и ничего нового в своем вопросе не спрошу, но просто очень срочно нужно это дело решить. Так что заранее извиняюсь.

Проблема вот в чем. Есть такой код

Код

<div onmouseout="alert()">
      asfdasdfsdafasdfsadf
      <div>
            fdfasfasdfasdfsd
      </div>
      asdfasdfasdfasdfasdf
</div>


Так  вот. Когда мышка заходит на внутренний div, это вызывает onmouseout внешнего div. А мне нужно, чтобы это событие происходило, только когда мышь выходит за границы общего div'а. Нарыл в инете решения этих проблем, но некоторые не подошли... а некоторые только для конкретных браузеров. Так что прошу Вашей помощи. Ну... естественно во внешнем теге, может быть сколь угодно много разных элементов... И все это дело должно работать нормально...

Заранее спасибо.

Автор: Sardar 18.1.2007, 15:18
Да, это очень не удобная фишка, придуманная ещё пьяными нетскейповцами и с тех пор ничего (ради совместимости) не менялось. Можешь обращаться к event.(srcElement|target) и проверять не является ли он дочерним элементом (итерируя до внешнего дива или пользуясь методом .contains).

Автор: Zeroglif 18.1.2007, 15:19
Цитата(Serge2k @  18.1.2007,  12:39 Найти цитируемый пост)
некоторые не подошли

Проверка на элемент (toElement и relatedTarget), к "которому пришли по событию" не подошла?


Автор: Serge2k 18.1.2007, 15:22
Цитата(Zeroglif @ 18.1.2007,  15:19)
Цитата(Serge2k @  18.1.2007,  12:39 Найти цитируемый пост)
некоторые не подошли

Проверка на элемент (toElement и relatedTarget), к "которому пришли по событию" не подошла?

хм... если не затруднит малек поподробнее...

Добавлено @ 15:23 
Цитата(Sardar @ 18.1.2007,  15:18)
Да, это очень не удобная фишка, придуманная ещё пьяными нетскейповцами и с тех пор ничего (ради совместимости) не менялось. Можешь обращаться к event.(srcElement|target) и проверять не является ли он дочерним элементом (итерируя до внешнего дива или пользуясь методом .contains).

видел, народ что то писал про contains. Но я так понял что он тока в IE реализован? И потом, если я правильно понимаю, мне в этом случае надо будет к каждому внутреннему элементу привязывать обработчик события...  или нет?

Автор: Sardar 18.1.2007, 15:37
Цитата(Serge2k @  18.1.2007,  14:22 Найти цитируемый пост)
мне в этом случае надо будет к каждому внутреннему элементу привязывать обработчик события...  или нет?

Нет, из обработчика самого внешнего элемента проверяем this.contains(event.(srcElement|target)). Метод contains сделать просто, хотя не эффективно:
Код
if(typeof(HTMLElement) != 'undefined') HTMLElement.prototype.contains = function(el) {
   var p = el.parentNode;
   while(p && p != this && p != document.documentElement) p = p.parentNode;
   return p === this;
}


Но способ от Zeroglif лучше и логичней.

Автор: Zeroglif 18.1.2007, 15:50
Цитата(Serge2k @  18.1.2007,  15:22 Найти цитируемый пост)
малек поподробнее...

http://developer.mozilla.org/en/docs/DOM:event.relatedTarget
http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/properties/toelement.asp

У тебя на диве висит onmouseout, когда мышом двигаешь и срабатывает это событие, то всегда есть объект, на котором оно сработало/родилось, это srcElement или target. Иногда нужно узнать, "куда ты ушёл" после того, как событие сработало, это - toElement или relatedTarget.  Соответственно, когда ты уходишь с внешнего дива на внутренний, то внешний - target, а внутренний - relatedTarget и наоборот, при выходе из внутреннего во внешний. Отсюда, нужна функция, которая будет перекрывать обработку события, если relatedTarget-ом будет внутренний, или внешний див. Что-нибудь вроде (очень приблизительно):

Код

function F(e) {
    e = e || event;
    var t = e.relatedTarget || e.toElement;
    if (t && t.id != 'inner' && t.id != 'outer') {


Но нужно учесть, что Опера наверняка заглючит... плюс, если ещё внутри блоки, то сложнее. smile Я бы, честно говоря, пересмотрел бы решение с onmouseout в принципе, наверняка, чего-нибудь можно сделать иначе.

Автор: Serge2k 18.1.2007, 15:57
Пасибки.... Буду пробовать... smile

Автор: 12345c 18.1.2007, 16:21
Тут есть статья - как пограмотнее работать с событиями. Не избегать их, а обязательно обрабатывать парами - over и out. Тогда не будет проблем с отслеживанием ухода с дива.

http://js2.ru/subs/subs018.shtml - "Контроль за перемещениями мыши."

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)