Логин:

Пароль:

Форумы
Общие вопросы
Document Object Model
Обсуждаем конференцию
Web Usability (test)

Общие вопросы

Следственный эксперимент

> Какой подъем ? Событие поднимается само.

Да. И Доходит До Твоего Обработчика В Корне Иерархии. И Там Ты Определяешь, Прошло Ли Оно На Своем Пути Нужный Тебе Элемент. Зачем? Если Можно Сразу Поставить Обработчик На Нужный Элемент.

> Весь анализ
> 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'а).

С Точки Зрения Структуры То, Что Ты Предлагаешь - Один Дли-и-инный Обработчик С Текстовыми Проверками На Имена И Типы Элементов, Вызывающий Другие Функции - Однозначно Хуже В Понимании И Поддержке, Чем Назначение Коротких Функций На Нужные Элементы.

А С Точки Зрения Производительности То, Что Ты Предлагаешь, Называется В Программировании Активным Ожиданием И Является Техникой, Которой Следует Избегать Всегда, Когда Это Возможно. Я Сейчас Здесь Не Возьмусь, Конечно, Про Это Говорить. Это Классическая Теория, И Ее Вполне Можно Отыскать В Книжках.
СообщениеАвторДата
azbook12.03.2003 14:48
azbook15.03.2003 14:30
Maniac12.03.2003 16:12
azbook12.03.2003 21:06
Maniac12.03.2003 22:53
azbook14.03.2003 23:20
Maniac15.03.2003 02:24
azbook15.03.2003 14:29
Maniac15.03.2003 16:30
azbook15.03.2003 19:49
Maniac15.03.2003 23:28
azbook16.03.2003 10:28
Maniac16.03.2003 16:41
azbook16.03.2003 20:23
Maniac17.03.2003 10:53
Leechy12.03.2003 22:44
azbook15.03.2003 00:13
Leechy16.03.2003 20:17
azbook17.03.2003 09:32