|
|
|
| Имеем блок hide_block. В него будут помещаться всяческие менюшки и сообщения. вызываемые на странице.
Имеем класс, который отображает меню на странице. Класс, кроме всего прочего. содержит, содержит функцию menu.hide() (Аргументов у нее нет).
Цель - клик по странице левой кнопкой мыши (эмуляция выпадающих меню в винде, офисах и тд), который меню закроет (те вызовет menu.hide()).
Бьюсь целый день, пока достиг только того, что ВСЕ клики (в том числе и на картинку, которая собственно и вызывает меню) выполняют скрытие...
function addHandler(object, event, handler, useCapture) {
if (object.addEventListener) {
object.addEventListener(event, handler, useCapture ? useCapture : false);
} else if (object.attachEvent) {
object.attachEvent('on' + event, handler);
} else alert("Add handler is not supported");
}
addHandler(document, "click", menu.hide);
|
Функция не моя. Кстати это не рабочий вариант - почему-то
addHandler(document, "click", menu.hide);
| не закрывает меню, его можно скрыть, только создав функцию в addHandler...
Самая hide:
hide : function() {
if(this.active_menu == "1") {
document.getElementById('hide_block').style.display = "none";
this.active_menu = "0";
}
}
| Это класс, так что двоеточия в кассу =)
Сижу целый день, что-то ничего у меня не пашет =( | |
|
|
| |
|
|
|
|
для: Lelik
(03.04.2009 в 10:06)
| | Функция взята от туда, но нет, не совсем это. В этом примере вызов меню происходит по событию клика правой кнопкой. А у меня имеется картинка, у которой по событию onclick вываливается меню.
Только суть скрытия та же. | |
|
|
|
|
|
|
|
для: Lelik
(03.04.2009 в 10:06)
| | Никто не в курсе? | |
|
|
|
|
|
|
|
для: devil943
(05.04.2009 в 16:18)
| | Мы-то в курсе.
А вот вы - нет.
То, что вы понаписали в стартовом топике, явно выдаёт в вас полного... непрофессионала - это если мягко сказать.
Ну вот скажите - ЗАЧЕМ в принципе вам нужна функция addHandler (), если вы пишете, что блок hide_block у вас уже ИМЕЕТСЯ?
Поясняю.
Если в HTML-коде ИЗНАЧАЛЬНО прописан в явном виде какой-то тег, то УМНЫЕ люди сразу пропишут в этот тег нужные им обработчики для ЛЮБОГО события, кои этот тег поддерживает. Например, так:
<TEG id="hide_block" onclick="" ... onmouseover="" ... onload="" ...>
|
А вот если этого тега ИЗНАЧАЛЬНО не имеется в HTML-коде и он создаётся ДИНАМИЧЕСКИ, например, с использованием метода createElement (), то вот ТОЛЬКО ТОГДА умные люди для назначения обработчиков тех самых событий (onclick="" ... onmouseover="" ... onload="" и прочих) используют нечто похожее на то, что вы написали здесь в функции addHandler ().
Повторяю вопрос: расскажите нам (если вы в курсе, конечно) - НА ХРЕНА вам нужна функция addHandler (), если блок hide_block у вас ИЗНАЧАЛЬНО уже ИМЕЕТСЯ?
Подсказываю вариант ответа №1: "Нормальные герои всегда идут в обход"(с)
и №2 "Хотел как лучше, а получается - как всегда"(с) | |
|
|
|
|
|
|
|
для: PAT
(06.04.2009 в 02:00)
| | Хм... спасибо, очень приято.
Поясняю: мне нужно чтобы по клику куда угодно, но не по этому блоку, блок скывался, т.е вызывалась функция menu.hide().
КАК это будет организовано мне все равно, на одном сайте нашел пример, где использовалась функция addHandler().
Разработка всегда идет постепенно, потом оптимизируется. На данный момент у меня даже с addHandler() не получилось достигнуть нужного результата.
PS я не претендую на профисионалим в js, но кое-какие знания я все же имею. Я не знаю, как с помощью псевдоатрибутов тега сделать так, чтобы блок скрывался, т.к событие должно вызываться явно не при взаимодействии пользователя с блоком | |
|
|
|
|
|
|
|
для: devil943
(06.04.2009 в 15:15)
| | Ну посмотрите, например, тему http://www.softtime.ru/forum/read.php?id_forum=4&id_theme=64116&page=1
У товарища аналогичная вашей задача:
1. ВСЕМУ документу СРАЗУ и НАПРЯМУЮ в HTML-коде назначается функция clickHandler ()
document.onclick = clickHandler;
|
2. функция clickHandler () определяет элемент, по которому кликнули
var evt = window.event || e, obj = evt.target || evt.srcElement;
|
3. функция clickHandler () проверяет имя класса элемента, по которому кликнули, на соответствие определённому имени
if (obj.className == 'Outline')
|
4. и эта же функция clickHandler () нужный блок показывает/скрывает:
with (document.getElementById (obj.id + 'details').style) display = (display == 'none') ? '' : 'none';
|
У вас точно такая же задача.
Но начали вы с того, что простейшую ПРЯМУЮ строку в HTML-коде
document.onclick = clickHandler;
| решили заменить ПСЕВДОумным
addHandler (document, 'click', clickHandler);
| , что ЗДЕСЬ совершенно не нужно. Объект document ВСЕГДА имеется на странице - создать или уничтожить его нельзя.
Спрашивается (в третий раз) - зачем назначение функции вы осуществляете таким способом?
Вам кажется, что ТАК вы выглядите умнее?
Далее простейшую по действиям функцию clickHandler () (у вас - menu.hide) вы стали излагать через, извините, задницу, используя туеву хучу непонятных вам самому функций и классов.
"Будьте проще" (с) | |
|
|
|
|
|
|
|
для: PAT
(06.04.2009 в 16:23)
| | Я пожалуй скину вам весь код и откомментирую его, т.к вы, походу, не можете понять, о чем я вас прошу...
var menu = {
active_menu : "0", // Флаг: открыто меню или нет
active : function(obj) { // Функция показывает блок
var d = document.getElementById('hide_block'); // Получаем обект - наш блок
if(d.style.display == "none") { // Если блок скрыт
var top = "0"; // значения по-умолчанию, потом будут передаваться в аргументах
var border = "69";
var width = "200";
var p = lib.findPos(obj); // Получаем позицию объекта, по которому юзер кликнул
var browser = lib.scrin(); // размеры окна браузера (библиотека моя, рабочаяя)
var top = p[1] + 1*top; // Отступ сверху
if(p[0] + width + border <= browser[0]) var left = p[0]; // Отступ слева (если появится горизонтальная полоса прокрутки - перемещаем левее
else var left = browser[0] - width - border;
d.style.top = top + "px"; // Позиционируем блок
d.style.left = left + "px";
d.style.display = "block"; // Показываем
this.active_menu = "1"; // теперь меню активно
var d = document.getElementById('hide_block_content'); // Блок hide_block - таблица с рамкой, hide_block_content - ячейка, которая будет содержать контент
d.className = "text_contener"; // Указываем ячейке класс, так как блок не только для этого меню применяется
d.style.padding = "3px"; // стили
d.style.width = "200px";
d.innerHTML = "Тестовый текст"; // Добавляем для теста текст
} else this.hide(); //Иначе скрываем (если блок уже показан, чтобы по клику на активирующий объект, блок скрывался
},
hide : function() {
if(this.active_menu == "1") { // Если активно именно меню, созданное этой функцией скрывалось
document.getElementById('hide_block').style.display = "none"; // скрываем
this.active_menu = "0"; // Теперь меню скрыто
}
}
}
|
Теперь небольшое пояснение: Блок, как я уже писал выше, испольется и для других целей, поэтому скрываться он должен именно по функции menu.hide(). | |
|
|
|
|