Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   закрытие при клике в body (https://javascript.ru/forum/dom-window/45553-zakrytie-pri-klike-v-body.html)

Mizter Egoist 05.03.2014 14:40

закрытие при клике в body
 
Добра всем!
Делаю малую корзину в битриксе, пытаюсь обновлять значения с помощью аякса, вроде все получается, кроме одного.
Вот что написалось:
$(document).ready(function(){
	showBasketLine();
	showBasketSmall();
	$(".storeBuy a").click(showBasketLine);
});
function showSmallBasket() {
	if($(".basketSmallBox").is(":visible")){
		$(".basketSmallBox").removeClass("shower").hide();
	} else if ($(".basketSmallBox").is(":hidden")) {
		showBasketSmall();
		$(".basketSmallBox").addClass("shower").show();
	}
}
function showBasketLine() {
	$.ajax({
		url: "/bitrix/templates/imperia.Pallet/include_areas/ajax.handler.php",
		type: "GET",
		cache: true,
		timeout: 1000,
		data: "block=basketLine",
		dataType: "html",
		success: function(data){
			$('.basketLineBox').html(data)
		}
	});
}
function showBasketSmall() {
	$.ajax({
		url: "/bitrix/templates/imperia.Pallet/include_areas/ajax.handler.php",
		type: "GET",
		cache: true,
		timeout: 1000,
		data: "block=basketSmall",
		dataType: "html",
		success: function(data){
			$('.basketSmallBox').html(data)
		}
	});
}

showSmallBasket() это функция вызываемая этой ссылкой
<a href="<?=$arParams["PATH_TO_BASKET"]?>" onclick="showSmallBasket(); return false;">...</a>
. Когда жмешь на ссылку, появляется блок с малой корзиной, жмешь на ссылку еще раз и малая корзина закрывается, и осталось только доделать закрытие малой корзины при щелчке в любом месте кроме малой корзины.
Помогите мне пожалуйста доделать.

danik.js 05.03.2014 14:47

В момент открытия корзины навешивать обработчик click на body (или на document). В обработчике проверяешь предков - если есть корзина (то есть клик пришелся по корзине), то игнорируешь клик. Иначе закрываешь корзину.
По закрытию корзины снимаешь обработчик.

Mizter Egoist 05.03.2014 14:56

Вот html
<div id="headerTel" class="basketHeader">
	<div class="basketLineBox">
		<div class="basketLine">
			<a href="cart" onclick="showSmallBasket(); return false;">В корзине <b>1</b> товар</a>
		</div>
	</div>
	<div class="basketSmallBox" style="display: none;">
		<div class="basketSmall">
			<h3>Позиции в Вашей корзине:</h3>
			<div class="basketSmallConteiner">
				<a href="/store/pallet/poddon_1200kh800_gost_9078/" title="Поддон 1200х800 ГОСТ 9078-84">Поддон 1200х800 ГОСТ 9078-84</a>
				Цена: 120.00 руб.
				Количество: 21.00
			</div>
			<form method="get" action="/p/cart">
				<input type="submit" value="Изменить количество">
			</form>
			<form method="get" action="/p/order">
				<input type="submit" value="Оформить заказ">
			</form>
		</div>
	</div>
</div>

danik.js, Я кучу всего перепробовал, в голове путаница, можете пожалуйста написать пример?

danik.js 05.03.2014 15:20

Цитата:

Сообщение от Mizter Egoist
можете пожалуйста написать пример

Не. Сегодняшняя квота бесплатного кода вышла ))
Мож кто поможет. А лучше не жди а пробуй сам. Хотя бы попытайся (и показывай код)

Mizter Egoist 05.03.2014 15:29

На сегодня мои мозги зашились. Тогда если мне завтра квота не выпадет, буду дальше танцевать с бубном.

ruslan_mart 06.03.2014 05:14

Можно сделать проще: при открытии корзины, ставить на body фиксированный прозрачный div на весь экран, при клике на этот div закрыть корзину и удалять этот div.

Sly_Enigma 06.03.2014 13:52

а не проще ли всего написать event.stopPropagation()?

kostyanet 06.03.2014 15:03

По-моему битрикс такая байда, где никакой корзины не надо. Или при чем тут вообще битрикс?

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

kostyanet 06.03.2014 15:07

А в той ссылке - по которой типа щелкают чтобы закрыть типа корзину - допускать это самое событие до туловища. Улавливаете?

Про битрикс. Что такое корзина? Это фильтр из всего ассортимента по критерию активный заказ больше 0.

Mizter Egoist 07.03.2014 09:32

$(document).ready(function(){
	showBasketLine();
	showBasketSmall();
	$(".storeBuy a").click(showBasketLine);
});
$("html").click(function() {
	if($(".basketSmallBox").is(":visible")){
		$(".basketSmallBox").removeClass("shower").hide();
	}
});
function showSmallBasket(event) {
	if($(".basketSmallBox").is(":visible")){
		$(".basketSmallBox").removeClass("shower").hide();
	} else if ($(".basketSmallBox").is(":hidden")) {
		showBasketSmall();
		$(".basketSmallBox").addClass("shower").show();
		event.stopPropagation();
	}
}
function showBasketLine() {
	$.ajax({
		url: "/bitrix/templates/imperia.Pallet/include_areas/ajax.handler.php",
		type: "GET",
		cache: true,
		timeout: 1000,
		data: "block=basketLine",
		dataType: "html",
		success: function(data){
			$('.basketLineBox').html(data)
		}
	});
}
function showBasketSmall() {
	$.ajax({
		url: "/bitrix/templates/imperia.Pallet/include_areas/ajax.handler.php",
		type: "GET",
		cache: true,
		timeout: 1000,
		data: "block=basketSmall",
		dataType: "html",
		success: function(data){
			$('.basketSmallBox').html(data)
		}
	});
}

Не работает((

Mizter Egoist 07.03.2014 09:41

$(document).ready(function(){
	showBasketLine();
	showBasketSmall();
	$(".storeBuy a").click(showBasketLine);
});
$("html").click(function() {
	if($(".basketSmallBox").is(":visible")){
		$(".basketSmallBox").removeClass("shower").hide();
	}
});
function showSmallBasket(event) {
	$(".basketLine a").click(function (event) {
		if($(".basketSmallBox").is(":visible")){
			$(".basketSmallBox").removeClass("shower").hide();
		} else if ($(".basketSmallBox").is(":hidden")) {
			showBasketSmall();
			$(".basketSmallBox").addClass("shower").show();
			event.stopPropagation();
		}
	});
}
function showBasketLine() {
	$.ajax({
		url: "/bitrix/templates/imperia.Pallet/include_areas/ajax.handler.php",
		type: "GET",
		cache: true,
		timeout: 1000,
		data: "block=basketLine",
		dataType: "html",
		success: function(data){
			$('.basketLineBox').html(data)
		}
	});
}
function showBasketSmall() {
	$.ajax({
		url: "/bitrix/templates/imperia.Pallet/include_areas/ajax.handler.php",
		type: "GET",
		cache: true,
		timeout: 1000,
		data: "block=basketSmall",
		dataType: "html",
		success: function(data){
			$('.basketSmallBox').html(data)
		}
	});
}

Вот так работает, только есть два минуса.
Первый, на ссылку нужно нажать два раза чтобы был отклик.
Второй, Если нажать внутри малой корзины, она скрывается

Mizter Egoist 07.03.2014 09:51

$(document).ready(function(){
	showBasketLine();
	showBasketSmall();
	$(".storeBuy a").click(showBasketLine);
	$("html").click(function() {
		if($(".basketSmallBox").is(":visible")){
			$(".basketSmallBox").removeClass("shower").hide();
		}
	});
});
function showSmallBasket() {
	$(this).click(function (event) {
		if($(".basketSmallBox").is(":visible")){
			$(".basketSmallBox").removeClass("shower").hide();
		} else if ($(".basketSmallBox").is(":hidden")) {
			showBasketSmall();
			$(".basketSmallBox").addClass("shower").show();
			event.stopPropagation();
		}
	});
}
function showBasketLine() {
	$.ajax({
		url: "/bitrix/templates/imperia.Pallet/include_areas/ajax.handler.php",
		type: "GET",
		cache: true,
		timeout: 1000,
		data: "block=basketLine",
		dataType: "html",
		success: function(data){
			$('.basketLineBox').html(data)
		}
	});
}
function showBasketSmall() {
	$.ajax({
		url: "/bitrix/templates/imperia.Pallet/include_areas/ajax.handler.php",
		type: "GET",
		cache: true,
		timeout: 1000,
		data: "block=basketSmall",
		dataType: "html",
		success: function(data){
			$('.basketSmallBox').html(data)
		}
	});
}

Вот так работает открытие и закрытие по щелчку на ссылке, а вот при щелчке на body или html ничего не происходит.

kostyanet 07.03.2014 10:05

Все через ж.

1. Сервер сам нарисует кол-во и сум-му заказов в процессе выдачи хтмл. Более того, там на сервере эти показания полезно закешировать скажем в профиле юзера который естественно кешируется в сессии. Вплоть до события обновления корзины. Следовательно не нужен вызов рендера заказов по событию загрузки страницы.

2. Щелчок по боди тупо скрывает контейнер независимо от его состояния. Ничего проверять не надо, потому что щелчок от ссылки-открывашки не должен распространиться до туловища, и такой же щелчок по контейнеру корзины - не должен. Только эти 2 щелчка что-то проверяют и о чем-то размышляют.

Это значит на ссылку вешается запрет пропаганды и на контейнер корзины вешается запрет пропаганды щелчка. Один раз и навсегда. По которому контейнер опять же тупо сам себя убирает, потому что проверять нечего - невидимый контейнер не щелкабелен. Переключатель только в ссылке. Если видим - скрыть, если скрыт - увидеть.

И вообще, на кой такой гемор. Открыли - закрыли по тому же месту. При чем тут туловище...

Mizter Egoist 07.03.2014 10:36

Я скажем так javascript не особо знаю, у меня это получилось благодаря гуглу и экспериментов, особой осмысленности в этом нет, и толком не знаю как реализовать все что Вы пишите((

kostyanet 07.03.2014 18:06

Как-то не вяжется. Кто в js не понимает тот пытается разобраться с js, а не с опупевшим jquery.

В общем из рабочего. Простейший вьюер. див на всю ширину, поверх него две "кнопки", то есть два дива по 30% шириной слева и справа, абсолютно позиционированы. Щелчок на этих кнопках вызывает соответственно следующую или предыдущую картинку, а щелчок посередине - по div под ними - закрывает плеер.

Как сделать чтобы щелчок на кнопках не проникал в контейнер для картинок?

prev_button.addEventListener("click", 
	function(event) {
		event.stopPropagation ? event.stopPropagation() : event.cancelBubble = !0;
	this.elem_anchor.click();
}, false);


Кнопки невидимые, без заливки, без обводки, без ничего. Только указатель мыши меняется в зависимости от расположения над: левой кнопкой - палец влево, правой - вправо, посередине - zoom-out.

Див-контейнер сам себя скрывает элементарно

overlay.addEventListener("click", 
	function(event) {
		this.style.visibility = "hidden";
}, false);


Ему не надо проверять видим я или невидим, потому что по невидимому щелкнуть не выйдет.

Появляется он после щелчка по ссылке на странице, куче которых вешается обработчик события щелчок по факту загрузки документа

...
elem.addEventListener("click", load_image, false);


вот она

var load_image = function(e) {

		if (e.preventDefault)
			e.preventDefault(); 
		e.returnValue = false;
		
// тут вырезано действующее вещество
		
		var arr = page_scrolls();
		overlay.style.visibility = "visible";
		overlay.style.top = arr[1] + "px";
//...
	};


Все то же самое у вас, с той лишь разницей что вместо оверлея - боди, и ссылка всего одна.

Mizter Egoist 12.03.2014 10:50

Не могу понять как мне все это цельным кодом написать

Mizter Egoist 12.03.2014 11:24

Подумал, подумал, вот что вышло, не знаю работает ли, но что то тут не так.
var showSmallBasket = function () {
	$(this).addEventListener("click", 
		function(event) {
			event.stopPropagation ? event.stopPropagation() : event.cancelBubble = !0;
		this.elem_anchor.click();
	}, false);
}
body.addEventListener("click", 
	function(event) {
		this.style.visibility = "hidden";
}, false);
document.onclick = function(e) {
	//не могу придумать
}

Mizter Egoist 12.03.2014 11:32

<!DOCTYPE html>

<html>
<head>
	<title>Корзина</title>
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
	<script type="text/javascript">
		var showSmallBasket = function () {
			$(this).addEventListener("click", 
				function(event) {
					event.stopPropagation ? event.stopPropagation() : event.cancelBubble = !0;
				this.elem_anchor.click();
			}, false);
		}
		body.addEventListener("click", 
			function(event) {
				this.style.visibility = "hidden";
		}, false);
		document.onclick = function(e) {
			
		}
	</script>
</head>

<body>
<div class="basketLineBox">
	<div class="basketLine">
		<a href="#" onclick="showSmallBasket(); return false;">В корзине <b>2</b> товара</a>
	</div>
</div>
<div class="basketSmallBox">
	<div class="basketSmall">
		<h3>Позиции в Вашей корзине:</h3>
		<div class="basketSmallConteiner">
			<div class="smallName"><a href="#" title="Товар №2"><h3>Товар №2</h3></a></div>
			<div class="smallPrice">Цена:&nbsp;1 руб.</div>
			<div class="smallQuantity">Количество:&nbsp;3.00</div>
		</div>
		<div class="basketSmallConteiner">
			<div class="smallName"><a href="#" title="Товар №2"><h3>Товар №2</h3></a></div>
			<div class="smallPrice">Цена:&nbsp;1 руб.</div>
			<div class="smallQuantity">Количество:&nbsp;3.00</div>
		</div>
		<div class="buttonWaySmallBasket">
			<form method="get" action="/p/cart">
				<input type="submit" value="Изменить количество">
			</form>
		</div>
		<div class="buttonWaySmallBasket">
			<form method="get" action="/p/order">
				<input type="submit" value="Оформить заказ">
			</form>
		</div>
	</div>
</div>
</body>
</html>

Mizter Egoist 12.03.2014 12:25

Дальше этого не ушел((
Работает только клик по ссылке, разворачивает и скрывает, а клик по body не работает.
var showSmallBasket = function () {
	$(this).click(function (event) {
		if($(".basketSmallBox").is(":visible")){
			$(".basketSmallBox").removeClass("shower").hide();
		} else if ($(".basketSmallBox").is(":hidden")) {
			$(".basketSmallBox").addClass("shower").show();
		}
		event.stopPropagation ? event.stopPropagation() : event.cancelBubble = !0;
	});
}
$("html").click(function() {
	if($(".shower"))
	$(".basketSmallBox").removeClass("shower").hide();
});

Mizter Egoist 12.03.2014 12:38

А вот та все работает, но есть один минус, при клике на body все скрывается, но при повторном клике на body все открывается.
var showSmallBasket = function () {
	$(this).click(function (event) {
		if($(".basketSmallBox").is(":visible")){
			$(".basketSmallBox").removeClass("shower").hide();
		} else if ($(".basketSmallBox").is(":hidden")) {
			$(".basketSmallBox").addClass("shower").show();
		}
		event.stopPropagation ? event.stopPropagation() : event.cancelBubble = !0;
		$(body).click(function() {
			if($(".shower")) {
				$(".basketSmallBox").removeClass("shower").hide();
			}
		});
	});
}


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