Следственный эксперимент> Какой подъем ? Событие поднимается само.
Да. И Доходит До Твоего Обработчика В Корне Иерархии. И Там Ты Определяешь, Прошло Ли Оно На Своем Пути Нужный Тебе Элемент. Зачем? Если Можно Сразу Поставить Обработчик На Нужный Элемент.
> Весь анализ > el=(window.srcElement): window.srcElement ? ev.target;
Вот Это _НЕ_ Работает В Общем Случае. Перечитай, Я Писал Об Этом Два Раза (По Поводу Потомков Нужного Тебе Элемента). Причем, Експлорерский srcElement Работает Также, Как target.
> Почему "криво"?
Ну, Хотя Бы Потому, Что Так, Как Ты, Никто Больше Не Делает :-). Дальше - Подробней.
> Почему назначить обработчики вначале - "ровно", а фактически сделать то-же самое, но в другом месте - "криво" ?
Хороший Вопрос. Возьмем Реальный Пример. Есть Две Таблицы, Для Которых Надо Обрабатывать MouseOver На Ячейках. Причем, Обрабатывать По-Разному. Вот Твой Способ Решения:
Повесить В Корень Иерархии Обработчик События, Который Будет Делать Примерно Следующее:
window.mouseover=MouseOver;
function MouseOver(e){ var El=(e.target)?e.target:event.srcElement; //Ищем Вверх По Дереву TD while(El.nodeName!='BODY' && El.nodeName!='TD') El=El.parentNode;
//Запоминаем Его, И Смотрим, В Какой Он Таблице var Cell=El; while(El.nodeName!='TABLE') El=El.parentNode; if(El.id=='Table1') Table1CellMouseOver(Cell); if(El.id=='Table2'){ Table2CellMouseOver(Cell); }//MouseOver
Весь Этот Код Нужен _Помимо_ Собственно Обработчиков. Теперь Предположим, Что Понадобилось Еще В Том Же Документе Обрабатывать MouseOver Над Каким-Нибудь Произвольным <A>. Надо Либо Примешивать Проверку На nodeName='A' В Первый while, А Потом Делать Еще Одну Проверку На То, <A> Это Или <TD>. Либо Писать Дальше Просто Еще Один Дополнительный Цикл Хождения От Начального Элемента, Вызвавшего События. Другими Словами, На Каждый Новый Обработчик MouseOver'а Приходится Городить Дополнительный Код Внутри Функции. Кто-То Здесь Говорил О Структурности, Да? :-)
А Вот Мой Способ. Хотя, Конечно, Никакой Он Не Мой, А Просто Стандартный:
with(document.getElementById('Table1')) for(var i=0;i<rows.length;i++) for(var j=0;j<rows[i].cells.length;j++) rows[i].cells[j].onmouseover=Table1MouseOver; with(document.getElementById('Table2')) for(var i=0;i<rows.length;i++) for(var j=0;j<rows[i].cells.length;j++) rows[i].cells[j].onmouseover=Table2MouseOver;
Причем, Этот Код Выполняется Не Каждый Раз, А Один Раз. И Хотя Производительность Тут - Не Главное, Она Таки Может Сказаться В Особо Нагруженных Случаях. Но Главное То, Что Второй Вариант Дает Большую Свободу: Ты Можешь Выбрать Все Ячейки По rows[i].cells[j], Можешь Выбрать Все Элементы С Конкретным Тегом По getElementsByTagName, Можешь Назначить События Конкретным ID'шникам По getElementByid, Можешь Даже Пользоваться Итераторами И TreeWalker'ами...
А Вот Твой Вариант Предполагает Только Один Вариант: Подъем По Дереву От Элемента, Вызвавшего Событие, До Нужного. А Этот Вариант Будет Не Всегда Удобным (Например, Если Бы Обработку События Надо Было Менять В Зависимости От Состояния Какого-Нибудь Другого Произвольного Элемента На Странице, Не Являеющегося Предком target'а).
С Точки Зрения Структуры То, Что Ты Предлагаешь - Один Дли-и-инный Обработчик С Текстовыми Проверками На Имена И Типы Элементов, Вызывающий Другие Функции - Однозначно Хуже В Понимании И Поддержке, Чем Назначение Коротких Функций На Нужные Элементы.
А С Точки Зрения Производительности То, Что Ты Предлагаешь, Называется В Программировании Активным Ожиданием И Является Техникой, Которой Следует Избегать Всегда, Когда Это Возможно. Я Сейчас Здесь Не Возьмусь, Конечно, Про Это Говорить. Это Классическая Теория, И Ее Вполне Можно Отыскать В Книжках. |