Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Скрыть эллемент страницы, при клике мимо него
 
 автор: Гость   (09.03.2011 в 09:52)   письмо автору
 
 

Есть всплывающее окно и нужно добиться следующего поведения: если окно отображается, а пользователь нажимает мышкой где-то мимо него - оно скрывается. Собственно раньше использовал создание div-а подложкки, который висел на заднем фоне (со 100% шириной и высотой), по нажатию на который и скрывалось окно. Но способ не очень удобный, и я подумал - может есть что-то проще?

Если важно - использую jQuery.

  Ответить  
 
 автор: Абырвалг   (09.03.2011 в 10:19)   письмо автору
 
   для: Гость   (09.03.2011 в 09:52)
 

1. На самом деле, как я понимаю, Ваше "всплывающее окно" - это просто какой-то тег, имеющий какой-то id (пусть это будет id="myPop") который "при открытии" из состояния display: none переводится в состояние display: block, а при "закрытии" - наоборот. Так?

2. Походу, у Вас имеется некая функция по открытию Вашего "всплывающего окна", так? Если не имеется (а просто выполнена одной строкой), то сделайте. И назовём её здесь Func_First ()

3. В самом начале этой функции Func_First () прописываете "навеску" ещё одной функции Func_Second () на объект document по событию onclick. Как "навешивать" - знаете? Поищите методы attachEvent () и addEventListener (). Но можно и проще (и кроссбраузерно): document.onclick = Func_Second; (БЕЗ круглых скобок)

4. Эта самая Func_Second () отслеживает клик по ЛЮБОМУ месту документа, определяет тег, по которому кликнули. Как определить элемент, по которому кликнули, знаете? Смотрите свойства srcElement и target. Далее функция определяет id этого элемента. Если id != myPop (сиречь, кликнули не по конкретно Вашему "всплывающему окну"), надо убедиться, что кликнули не по какому-то тегу, который находится внутри этого "всплывающего окна". Перебираете последовательно по иерархии родителей объекта, по которому кликнули и проверяете всякий раз его id (сравнивая с myPop) и проверяя - есть ли следующий "родитель".

5. Если сам объект клика или какой-то из его "родителей" имеет id="myPop" - значит, кликнули по "всплывающему окну". Функция Func_Second () просто завершает свою работу простым выходом return. А вот если myPop так и не встретится и следующего родителя не существует (сиречь, перебирая иерархию, Вы добрались до тега <HTML>), то, значится, кликнули ВНЕ окна. В этом случае Вам надо сначала отменить действие функции Func_Second () - см. методы detachEvent () и removeEventListener () - но можно и проще: document.onclick = null;. И уже после этого "погасить" Ваше "всплывающее окно", установив ему стиль display: none
------

Всё понятно?
Насчёт "длительности" процесса перебора "родителей" не переживайте. Обычно сильно "переживают", типа - "это же долго". Это совсем недолго: на стандартной странице вложенность - не более 10 тегов (очень редко - 15). Перебор 15-ти штук с проверкой их id - тысячные доли секунды.
------

Где-то здесь я (не помню уже, под каким именно никнеймом, но точно помню, что для юзера "колобок" по-латински) давал конкретный скрипт этой функции - я имею в виду названную в тексте Func_Second (). Поищите, если сами написать не сможете.
Ну или "свистите", если и не сможете, и не найдёте...
-----

jQuery по определению не может быть "важным".

  Ответить  
 
 автор: psychomc   (09.03.2011 в 15:00)   письмо автору
 
   для: Абырвалг   (09.03.2011 в 10:19)
 

без jquery:
// элемент по которому кликнули
var el = event.target || event.srcElement;


далее просто определяйте находится он внутри или вне блока. если внутри - ничего не надо делать, если вне - скрывайте нужный вам блок (с помощью функции, повешенной на событие click document'а)

  Ответить  
 
 автор: mihdan   (10.03.2011 в 12:00)   письмо автору
 
   для: Абырвалг   (09.03.2011 в 10:19)
 

Наверное, вы тогда были PAT?

PS: кстати, отчего вы меняете ники?

  Ответить  
 
 автор: SHAman   (10.03.2011 в 12:07)   письмо автору
 
   для: mihdan   (10.03.2011 в 12:00)
 

Пытается избавиться от негативной кармы:)

  Ответить  
 
 автор: Абырвалг   (10.03.2011 в 16:11)   письмо автору
 
   для: SHAman   (10.03.2011 в 12:07)
 

Всё проще - регулярно меняю компьютеры. Так уж получается.

Адреса из избранного переношу на флешке.
А копаться с вытаскиванием паролей со страниц - лень.
Проще зарегистрироваться вновь.

  Ответить  
 
 автор: oldold   (18.03.2011 в 18:43)   письмо автору
 
   для: Абырвалг   (09.03.2011 в 10:19)
 

>Ну или "свистите", если и не сможете, и не найдёте...

Не нашёл.
Во первых колобков два оказалось, coloboc и kolobok.
Во вторых поиск вывалил без мелочи 700 ссылок, ну не реально их пересмотреть.

Поможешь?

  Ответить  
 
 автор: Абырвалг   (18.03.2011 в 22:11)   письмо автору
 
   для: oldold   (18.03.2011 в 18:43)
 

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1251">
<script>
function openPop ()
{
var z = "if (document.addEventListener) document.addEventListener ('click', clickDocument, false); ";
z += "else if (document.attachEvent) document.attachEvent ('onclick', clickDocument, false); "
z += "else document.onclick = clickDocument;"; setTimeout (z, 0);
document.getElementById ('myPop').style.display = 'block';
document.getElementById ('goPop').style.visibility = 'hidden';
}

function closePop ()
{
if (document.removeEventListener) document.removeEventListener ('click', clickDocument, false);
else if (document.detachEvent) document.detachEvent ('onclick', clickDocument, false);
else document.onclick = null;
document.getElementById ('myPop').style.display = 'none';
document.getElementById ('goPop').style.visibility = 'visible';
}

function clickDocument (ev)
{
var e = window.event || ev, o = e.srcElement || e.target;
while (o.parentNode) {if (o.id == 'myPop') break; else o = o.parentNode}
if (o.id != 'myPop') closePop ();
}
</script>
</head>
<body>
<a id="goPop" href="#" onclick="openPop (); return false">Открыть всплывающее окно<a> 

<div id="myPop" style="display: none; width: 654px; height: 123px; background-color: aqua; text-align: center">
Это - всплывающее окно.<hr>Закрыть его можно, кликнув <a href="#" onclick="closePop (); return false">сюда<a>, или по любому месту страницы вне синего фона.
</div>
</body>
</html>

  Ответить  
 
 автор: oldOld   (19.03.2011 в 09:47)   письмо автору
 
   для: Абырвалг   (18.03.2011 в 22:11)
 

Спасибо, сегодня с утра сам пришёл к этому решению.
Меня этот цикл интересовал.
while (o.parentNode) {if (o.id == 'myPop') break; else o = o.parentNode} 
if (o.id != 'myPop') closePop (); 
}


Я изначально через евал сделал, ну какие тут комментарии....
Эта тема заставила думать головой.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования