MouseOver, определить самый верхний div

glab
На сайте с 10.09.2008
Offline
42
903

Здравствуйте. Надеюсь на вашу помощь.

Есть HTML код:


<div id="first" onmouseover="this.style.background='#ff0000'">
content
<div id="second" onmouseover="this.style.background='#ff0000'">
content
<div id="fourth" onmouseover="this.style.background='#ff0000'">content</div>
</div>
<div id="third" onmouseover="this.style.background='#ff0000'">content</div>
</div>

Как видите, у каждого div'a прописано событие при наведении мыши, которое делает фон красным, однако если навести мышь на див с id равным fourth в красный окрашивается не только он, а ещё дивы находящиеся по ним, т.е. second и first. Как с этим справиться, как сделать так что выделялся только тот див на который наведена мышь, т.е. самый верхний?

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

Maxouni
На сайте с 18.11.2008
Offline
119
#1

Как самый простор вариант, вместо this.style.background='#ff0000', вставь яваскрипт функцию, в которой пропиши каким цветом какие дивы делать при наведении.

например при наведении на first


this.style.background='#ff0000';
document.getElementById('second').style.background='#ffffff';
document.getElementById('third').style.background='#ffffff';
document.getElementById('fourth').style.background='#ffffff';
Создание, продвижение, поддержка сайтов и приложений.
М
На сайте с 08.02.2006
Offline
59
#2

Чтобы мышу добраться до дива fourth, ему надо проехать через first и second, в итоге у вас последовательно обрабатывается три события. Как вариант, на каждом onmouseover надо перекрашивать все дивы в исходный цвет, а текущий в красный.

P
На сайте с 08.03.2007
Offline
250
#3

mouseover - не совсем правильный способ ловить события.

Стоит почитать https://developer.mozilla.org/en/DOM/element.addEventListener - есть возможность прекратить обработку событий по какому-то условию, в частности первый обработчик сообщит что дальше обрабатывать не надо.

JTRTA
На сайте с 06.07.2008
Offline
25
#4

Описанный вами процесс называется event bubbling или по русски называют"всплывание событий".

например по запросу: http://www.google.ru/search?hl=ru&rlz=1C1CHMQ_ruRU307RU308&newwindow=1&q=javascript+всплывание+событий&btnG=Поиск&lr=&aq=f&oq= есть кроссбраузерные методы.

Кроме того почти во всех javascript фреймворках есть встроенные функции остановки всплывания.

Дизайн /ru/forum/493415 (/ru/forum/493415) Верстка от 15$ /ru/forum/509339 (/ru/forum/509339) Сайты под ключ aiogino.studio@gmail.com icq: 460146806
П
На сайте с 08.06.2007
Offline
63
#5

ТС, что бы сделать нормально то что вам надо, надо что бы у ваших дивов было что то общее. Или родитель один, или класс, или ещё что то..

Всё остальное, типа через ID, как выше предлагали, от лукавого.

Набросал пару вариантов, ещё когда только тема появилась, но потёр. Так как ленив по сути, не хотелось бесконечных уточнений что именно нужно.

[Удален]
#6
glab:
Как видите, у каждого div'a прописано событие при наведении мыши, которое делает фон красным, однако если навести мышь на див с id равным fourth в красный окрашивается не только он, а ещё дивы находящиеся по ним, т.е. second и first.

можно конечно заниматься обработкой всплывающих событий, но на мой взгляд здесь это лишние т.к. изначально есть ошибка в понимании верстки, а именно блоки second и first находятся не под блоком fourth, а внутри него!

соответственно измените версту и не будет проблем :)

[Удален]
#7

ага, а вообще для этого есть псевдокласс :hover который работает корректно, с пузырьком но без capture, и вообще удобнее в сто раз.

glab
На сайте с 10.09.2008
Offline
42
#8

Всем спасибо, решение нашёл уже.

Достаточно при наведении на fourth отключить событие:

document.getElementById('fourth').onmouseover = function(event) {
event = event || window.event

if (event.stopPropagation) {
// Вариант стандарта W3C:
event.stopPropagation()
} else {
// Internet Explorer:
event.cancelBubble = true
}
}

Тут писали про то, что сменить верстку. Задача как раз в том, что верстку не поменять.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий