Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.08.2012, 18:43
Интересующийся
Отправить личное сообщение для Dazar Посмотреть профиль Найти все сообщения от Dazar
 
Регистрация: 18.04.2012
Сообщений: 24

Спрятать блок по щелчку в другое место
Есть всплывающая контекстная менюшка, которая высвечивается, если кликнуть по элементу. Как сделать, чтобы она пряталась при клике в любое другое место, кроме как не по ней? Как это обычно делают?
У меня есть два варианта:
1) Поставить всему документу событие onclick, а самой менюшке убрать его.
2) одновременно с менюшкой показывать прозрачный div на весь документ, с меньшим, чем у неё z-индексом, с событием onclick, которое будет прятать и этот див, и меню.

Есть ещё какие-нибудь способы?

Последний раз редактировалось Dazar, 24.08.2012 в 18:46.
Ответить с цитированием
  #2 (permalink)  
Старый 24.08.2012, 19:13
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

<button class="but">click</button>
<div id="div" style="display: none; background: lightgreen">
	<button>button</button>
	text
</div>

<script>
window.onload = function () {
	function sh(elem) {
		if (elem.style.display != 'block') {
			elem.style.display = 'block';
		} else {
			elem.style.display = 'none';
		}
	}

	var div = document.getElementById('div');
	
	document.body.onclick = function (e) {
		e = e || event;
		var target = e.target || e.srcElement;
		if (target.className == 'but') {
			sh(div);
		} else {
			while (target && target != div) {
				target = target.parentNode;
			}
			if (target != div) {
				div.style.display = 'none';
			}
		}
	}

}
</script>

Последний раз редактировалось bes, 24.08.2012 в 19:15.
Ответить с цитированием
  #3 (permalink)  
Старый 24.08.2012, 19:35
Интересующийся
Отправить личное сообщение для Dazar Посмотреть профиль Найти все сообщения от Dazar
 
Регистрация: 18.04.2012
Сообщений: 24

То есть мой первый вариант,только куда больше продуманный. Спасибо.
Ответить с цитированием
  #4 (permalink)  
Старый 24.08.2012, 19:48
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Не совсем так, в первом случае был клик по "фону", а здесь идёт отсечение клика для всех элементов меню, включая само меню.
Если не требуются дополнительные элементы, которые должны участвовать в процессе (быть кликабельными и т.п.) при открытом меню, то первый вариант, на мой взгляд, лучше, так как требует меньше вычислений.
Ответить с цитированием
  #5 (permalink)  
Старый 24.08.2012, 19:55
Интересующийся
Отправить личное сообщение для Dazar Посмотреть профиль Найти все сообщения от Dazar
 
Регистрация: 18.04.2012
Сообщений: 24

Сейчас очень долго ресчленял ваш код, увидел и ту тонкость, о которой вы говорите. Поскольку мне нужно было только закрытие дива, и значительную часть листа у меня занимает просто фон(не входит в body), у меня осталось это:
document.onclick = function (e) {
var div = document.getElementById('menu');
		e = e || event;
		var target = e.target || e.srcElement;
		if (target.className != 'but') {
			while (target && target != div) {
				target = target.parentNode;
			}
			if (target != div) {
				div.style.display = 'none';
			}
		}
	}

Спасибо большое.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обработчик событий в другое место sympler Общие вопросы Javascript 9 28.02.2011 10:34