![]() |
|
Модераторы: Sardar, Aliance |
![]()
|
|
| boombick |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 305 Регистрация: 20.4.2005 Где: Moscow, Russia Репутация: нет Всего: 9 |
Вообщем, проблема в следующем:
По щелчку мыши показывается div, который до щелчка был скрыт (display:none) Хотелось бы, по щелчку мыши _вне_ слоя скрывать его... В какую сторону копать? -------------------- |
|||
|
||||
| Avb |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 5.7.2006 Репутация: 5 Всего: 13 |
Копать в сторону DOM Events.
Используешь тот факт что событие, где бы оно не возникло распространяется по дереву DOM. В момент показа дива навешиваешь событие click на document.body. На каком бы элементе не кликнул пользователь, событие дойдет до боди. В обработчике события click для body можно узнать какой элемент инициировал событие. Если этот элемент не является самим дивом, или его child-ом, то прячем див, в противном случае - нет. Я пользую библиотеку prototype.js. В ней: Event.observe(document.body, 'click', обработчик, false); - навешиваем обработчик события В обработчике: Event.element(event) - элемент, вызвавший событие. (event - объект события). Если Event.element(event) - не твой див, то проверяешь не является ли он его child-ом, например, используя Element.childOf Event.stop(event) - остановка дальнейшего распространения события. Event.stopObserving(document.body, 'click', обработчик, false); - удаляем обработчик события Это сообщение отредактировал(а) Avb - 18.10.2006, 10:52 |
|||
|
||||
| szz |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1289 Регистрация: 31.5.2005 Где: Moscow, Jerusalem Репутация: нет Всего: 33 |
Avb, а ты бы мог дать пример? Я тоже использую прототип.js (преимущественно ради аякса и jsona),
но, хоть твои объяснения описывают общий процесс довольно ясно, все же хотелось бы наглядности. Все ясно с Event.observe и Event.stopObserving А вот как быть с Event.element(event) не совсем ясно. Это нужно проверять в обработчике, а он должен быть методом элемента или же глобальной функцмей (под window)? И как же писать? Я понял так (уверен что неправильно
--------------------
|
||||
|
|||||
| szz |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1289 Регистрация: 31.5.2005 Где: Moscow, Jerusalem Репутация: нет Всего: 33 |
Ладно, я нашел, если кому еще понадобится - вот http://www.prototypejs.org/api/event/element
--------------------
|
|||
|
||||
| Avb |
|
||||||||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 5.7.2006 Репутация: 5 Всего: 13 |
szz, по твоему примеру:
1. обработчик должен получать первым аргументом объект event, поэтому:
2. document.getElementById равносильно $ (зачем писать больше? 3. зачем в if-е делать два отрицания. По-моему понятнее и удобнее так:
4. По причине п.2:
меняем на
5. Для того, чтобы обработчик получал первым аргументом объект события, необходимо при навешивании обработчика использовать bindAsEventListener() Вот так:
Обработчик события может быть глобальной функцией, может быть членом класса. Для привязки конкретного объекта к функции используются bind и bindAsEventListener. Второй помимо объекта привязывает еще и событие. Сейчас эти функции могут принимать более одного параметра. Т.о. в функцию можно передавать дополнительные параметры, например, в обработчик события можно передать сразу элемент на котором это событие произошло. Если хочешь полезный пример, то выложи свой код: верстку и js. А я покажу, как бы я написал сейчас то, что тебе нужно. (Полгода назад я писал бы по-другому Добавлено через 5 минут и 47 секунд Ну и кроме этого надеюсь ты знаешь, что для того чтобы код был совместим с XHTML значения атрибутов нужно брать в кавычки, а скрипты помещать в блок комментария. Вот так:
а лучше выносить в отдельный файл и подключать так:
без language = "javascript" и еще чего бы то ни было. |
||||||||||||||
|
|||||||||||||||
| SamDark |
|
|||
|
Добрый кот ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1424 Регистрация: 25.7.2006 Где: Voronezh Репутация: нет Всего: 38 |
Мдя... народ, вы чего?
-------------------- rmcreative.ru — Это жжж неспроста... yiiframework.ru — О фреймворке Yii на русском. reggi — здесь я регистрирую домены |
|||
|
||||
| Avb |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 5.7.2006 Репутация: 5 Всего: 13 |
SamDark, интересно. А можно пример?
|
|||
|
||||
| SamDark |
|
|||
|
Добрый кот ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1424 Регистрация: 25.7.2006 Где: Voronezh Репутация: нет Всего: 38 |
-------------------- rmcreative.ru — Это жжж неспроста... yiiframework.ru — О фреймворке Yii на русском. reggi — здесь я регистрирую домены |
|||
|
||||
| Avb |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 5.7.2006 Репутация: 5 Всего: 13 |
SamDark, у меня этот код работает в ИЕ7
и в ИЕ6 после замены
на
В ФФ2.0.0.4, Опера 9.21 и Safari - не работает. Да и возможно, не всегда удобно перемещать фокус на открываемый див. |
||||
|
|||||
| SamDark |
|
|||
|
Добрый кот ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1424 Регистрация: 25.7.2006 Где: Voronezh Репутация: нет Всего: 38 |
Avb,
Ну, тогда на document.body вешать и фильтровать выбранный div. -------------------- rmcreative.ru — Это жжж неспроста... yiiframework.ru — О фреймворке Yii на русском. reggi — здесь я регистрирую домены |
|||
|
||||
| SamDark |
|
|||
|
Добрый кот ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1424 Регистрация: 25.7.2006 Где: Voronezh Репутация: нет Всего: 38 |
Avb,
К сожалению, не срабатывает по щелчку на самом body если нет никаких элементов. Если щёлкать на тексте, например, работает. Чёрт, туплю... Всё верно. Так и должно быть. Спасибо за решение. Это сообщение отредактировал(а) SamDark - 27.6.2007, 17:54 -------------------- rmcreative.ru — Это жжж неспроста... yiiframework.ru — О фреймворке Yii на русском. reggi — здесь я регистрирую домены |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | JavaScript: Применение библиотек | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |