Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> подавить onmouseout, при уходе на дочерние элементы 
:(
    Опции темы
Serge2k
Дата 18.1.2007, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 16.7.2005

Репутация: нет
Всего: нет



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

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

Код

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


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

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


Это сообщение отредактировал(а) Serge2k - 18.1.2007, 12:39
PM MAIL   Вверх
Sardar
Дата 18.1.2007, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



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


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Zeroglif
Дата 18.1.2007, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



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

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


PM MAIL WWW   Вверх
Serge2k
Дата 18.1.2007, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 16.7.2005

Репутация: нет
Всего: нет



Цитата(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 реализован? И потом, если я правильно понимаю, мне в этом случае надо будет к каждому внутреннему элементу привязывать обработчик события...  или нет?

Это сообщение отредактировал(а) Serge2k - 18.1.2007, 15:25
PM MAIL   Вверх
Sardar
Дата 18.1.2007, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(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 лучше и логичней.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Zeroglif
Дата 18.1.2007, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



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

http://developer.mozilla.org/en/docs/DOM:event.relatedTarget
http://msdn.microsoft.com/library/default....s/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 в принципе, наверняка, чего-нибудь можно сделать иначе.
PM MAIL WWW   Вверх
Serge2k
Дата 18.1.2007, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 16.7.2005

Репутация: нет
Всего: нет



Пасибки.... Буду пробовать... smile
PM MAIL   Вверх
12345c
Дата 18.1.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 57
Всего: 101



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

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

Это сообщение отредактировал(а) 12345c - 3.3.2008, 12:47


--------------------
Google Code Playground - онлайн-отладка своих примеров HTML+JS без регистрации, с сохранением по URL, без кириллицы. Go
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0828 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.