Показать сообщение отдельно
  #1 (permalink)  
Старый 07.03.2009, 06:13
no. no. вне форума
Новичок на форуме
Отправить личное сообщение для no. Посмотреть профиль Найти все сообщения от no.
 
Регистрация: 16.08.2008
Сообщений: 9

Opera/IE баг с очередью обработки события несколькими элементами (напр onmouseover)
Нашел такой баг - если в ячейке таблицы есть внутри элементы, например, div, который занимает всю ячейку TD и для td задана функция onmouseover, а для div не задана нигде и никак, то в процессе обработки этой функции onmouseover в ней каким то чудом в качестве Event.srcElement фигурирует div хотя для него, повторюсь, не была никоим образом задана функция onmouseover. Этот баг есть и в ИЕ и в Опере, в опере он я бы сказал пожесче.
элементы кода:

так выглядит ячейка таблицы:
<td><div class="rc"><div class="dgr" onclick="f1(...);">X</div>123<br><b>Текст1</b><br>Текст2</div></td>

onmouseover всем ячейкам таблицы задает функция так (срабатывает при загрузке страницы):
в цикле пробегаем по всем ячейкам и

<цикл>
...
if(td.attachEvent) {
td.attachEvent('onmouseover', HighLightTD); td.attachEvent('onmouseout', HideTD);
}

if(td.addEventListener) {
td.addEventListener('mouseover', HighLightTD, true); td.addEventListener('mouseout', HideTD, true);}
...

Функции HighLigtTD и HideTD соотв подсвечивают или убирают подсветку с ячейки таблицы. Но не только. Подсветка/Хайд изначальна в Опере тоже глючили из-за описываемого бага. Но с этим я справился. Самый главный баг в том что функции HighLightTD/HideTD срабатывают и на наведение на внутренний div ячейки таблицы, хотя для них не устанавливались. Создается впечатление что это наследование внутренним дивом функции onmouseover ячейки таблицы td.

Ну для большей ясности

function HighLightTD(e)
{
if(!e) var e = window.event;
if(e.srcElement) td = e.srcElement; else td = e.currentTarget;

// !! для проверки делаем алерт
alert(td.tagName);
// и в этом алерте какимто чудом появится DIV хотя, повторюсь, на DIV эта функция не вешалась
...
}

итак:
<td onmouseover=...> <div> .. </div> </td>

наводим мышку на td сначала будет алерт с тэгом TD, а после сразуже с DIV

Помогите с этим разобраться, как исключить обработку события onmouseover для внутреннего div'a ячейки таблицы?

Да в Файрфокс всё прекрасно работает.

Последний раз редактировалось no., 07.03.2009 в 06:14. Причина: дополнение
Ответить с цитированием