Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Спрятать блок по щелчку в другое место (https://javascript.ru/forum/dom-window/31053-spryatat-blok-po-shhelchku-v-drugoe-mesto.html)

Dazar 24.08.2012 18:43

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

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

bes 24.08.2012 19:13

<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>

Dazar 24.08.2012 19:35

То есть мой первый вариант,только куда больше продуманный. Спасибо.

bes 24.08.2012 19:48

Не совсем так, в первом случае был клик по "фону", а здесь идёт отсечение клика для всех элементов меню, включая само меню.
Если не требуются дополнительные элементы, которые должны участвовать в процессе (быть кликабельными и т.п.) при открытом меню, то первый вариант, на мой взгляд, лучше, так как требует меньше вычислений.

Dazar 24.08.2012 19:55

Сейчас очень долго ресчленял ваш код, увидел и ту тонкость, о которой вы говорите. Поскольку мне нужно было только закрытие дива, и значительную часть листа у меня занимает просто фон(не входит в 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';
			}
		}
	}

Спасибо большое.


Часовой пояс GMT +3, время: 05:36.