PageSourceSearch

https://latitudo.ru/local/templates/aspro_next_newdesign/js/newdesign-basket-count.js

js latitudo.ru collected 2026-10-04 18:41:54 UTC 4,181 bytes, 93 lines download raw bytes

1/**
2 * Цифра у корзины после добавления товара.
3 *
4 * Штатная цепочка темы этого не делала: после успешного `ajax/item.php` кнопка
5 * переключалась на «В корзине», а `getActualBasket()` и `reloadTopBasket()` —
6 * те, что обновляют `arBasketPrices` и пишут число в шапку и нижнее меню, — не
7 * вызывались (проверено на боевом сайте 19 августа 2026: после нажатия уходит
8 * ровно один запрос, `item.php`, и больше ничего). Обработчиков `.to-cart` у
9 * темы несколько, ветвлений внутри ещё больше, и какой именно отработает,
10 * зависит от вида карточки — чинить их по одному смысла нет.
11 *
12 * Поэтому спрашиваем итог сами. `ajax/show_basket_actual.php` отдаёт скрипт с
13 * `arBasketPrices`, оттуда и берём BASKET_COUNT. Разметку счётчика не выдумываем:
14 * пишем в те же узлы, что и тема (.basket-link.basket .count с классами
15 * empted / basket-count), — они есть и в шапке, и в нижней панели.
16 *
17 * Спрашиваем не один раз: добавление на боевом занимает секунду-полторы, и
18 * первый же запрос успевает раньше самого добавления — сервер отдаёт прежнее
19 * число. Поэтому опрашиваем с нарастающей паузой и останавливаемся, как только
20 * число изменилось (или после последней попытки).
21 */
22(function () {
23	'use strict';
24
25	if (window.__ndBasketCount) return;
26	window.__ndBasketCount = true;
27
28	var DELAYS = [700, 1500, 2500, 4000, 6000];
29	var timers = [];
30	var startCount = null;
31
32	function siteDir() {
33		var o = window.arNextOptions;
34		return (o && o.SITE_DIR) ? o.SITE_DIR : '/';
35	}
36
37	/* Что сейчас нарисовано у корзины — с этим и сравниваем ответы сервера. */
38	function shownCount() {
39		var box = document.querySelector('.basket-link.basket .count');
40		if (!box) return null;
41		var n = parseInt((box.textContent || '').trim(), 10);
42		return isNaN(n) ? 0 : n;
43	}
44
45	function apply(count) {
46		var n = parseInt(count, 10);
47		if (isNaN(n)) return;
48
49		[].forEach.call(document.querySelectorAll('.basket-link.basket'), function (link) {
50			link.classList.toggle('basket-count', n > 0);
51
52			var box = link.querySelector('.count');
53			if (!box) return;
54
55			box.classList.toggle('empted', n <= 0);
56			if (box.textContent.trim() !== String(n)) box.textContent = n;
57		});
58	}
59
60	function refresh() {
61		var xhr = new XMLHttpRequest();
62		xhr.open('POST', siteDir() + 'ajax/show_basket_actual.php', true);
63		xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
64		xhr.onload = function () {
65			/* Ответ — кусок html со скриптом, разбирать его целиком незачем:
66			   нужно одно число. */
67			var m = /'BASKET_COUNT'\s*:\s*'(\d+)'/.exec(xhr.responseText || '');
68			if (!m) return;
69
70			apply(m[1]);
71
72			/* Дождались изменения — остальные попытки отменяем. */
73			if (startCount !== null && parseInt(m[1], 10) !== startCount) {
74				timers.forEach(clearTimeout);
75				timers = [];
76			}
77		};
78		try { xhr.send('ACTION=add'); } catch (e) { }
79	}
80
81	function schedule() {
82		timers.forEach(clearTimeout);
83		startCount = shownCount();
84		timers = DELAYS.map(function (ms) { return setTimeout(refresh, ms); });
85	}
86
87	/* Фаза перехвата: тема на некоторых кнопках останавливает всплытие. */
88	document.addEventListener('click', function (e) {
89		var t = e.target;
90		if (!t || !t.closest) return;
91		if (t.closest('.to-cart')) schedule();
92	}, true);
93})();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.