PageSourceSearch

https://polpartner.ru/js/cart_add.js?v=2

js polpartner.ru collected 2026-10-09 23:45:32 UTC 5,404 bytes, 116 lines download raw bytes

1/* «В корзину» без ухода со страницы. 21.09.2026
2   ------------------------------------------------------------------
3   Было: кнопка на плитке каталога — это обычная ссылка на
4   /order/?product[таблица][id]=…, а движок отвечает 302 на /cart/.
5   То есть любой клик уносил покупателя из каталога, и за вторым
6   товаром он возвращался кнопкой «назад».
7
8   Стало: клик перехватывается, запрос уходит тем же адресом фоном
9   (браузер сам идёт по редиректу и получает страницу корзины),
10   а покупатель остаётся на месте и видит плашку «товар в корзине».
11   Счётчик в шапке берём ИЗ ОТВЕТА — движок считает строки корзины,
12   и прибавлять единицу вслепую нельзя: тот же товар второй раз
13   строку не заводит, а увеличивает количество.
14
15   Если запрос не прошёл — уходим по ссылке, как раньше.
16   Ссылки колеруемых красок Dunn Edwards сюда не попадают: у них
17   в каталоге стоит адрес карточки, а не /order/. */
18(function () {
19	var STIL = '' +
20		'#dob-korzina{position:fixed;right:16px;bottom:16px;z-index:9999;max-width:320px;' +
21		'background:#fff;border:1px solid #dcdcdc;box-shadow:0 6px 24px rgba(0,0,0,.18);' +
22		'padding:14px 16px;font-size:14px;line-height:1.4;display:none}' +
23		'#dob-korzina.dob-on{display:block}' +
24		'#dob-korzina b{display:block;margin-bottom:6px}' +
25		'#dob-korzina .dob-tovar{color:#666;margin-bottom:10px;word-break:break-word}' +
26		'#dob-korzina a,#dob-korzina button{display:inline-block;border:1px solid #4d6675;' +
27		'background:#4d6675;color:#fff;padding:7px 12px;font-size:13px;text-decoration:none;' +
28		'cursor:pointer;margin-right:6px}' +
29		'#dob-korzina button{background:#fff;color:#4d6675}' +
30		'@media (max-width:767px){#dob-korzina{right:10px;left:10px;bottom:10px;max-width:none}}';
31
32	var plashka;
33
34	function sozdat() {
35		if (plashka) return plashka;
36		var s = document.createElement('style');
37		s.appendChild(document.createTextNode(STIL));
38		document.head.appendChild(s);
39
40		plashka = document.createElement('div');
41		plashka.id = 'dob-korzina';
42		plashka.innerHTML = '<b>Товар в корзине</b>' +
43			'<div class="dob-tovar"></div>' +
44			'<a href="/cart/">Перейти в корзину</a>' +
45			'<button type="button">Продолжить</button>';
46		document.body.appendChild(plashka);
47		plashka.querySelector('button').onclick = spryatat;
48		return plashka;
49	}
50
51	var tajmer;
52	function spryatat() {
53		if (plashka) plashka.className = '';
54		clearTimeout(tajmer);
55	}
56
57	function pokazat(imya) {
58		var p = sozdat();
59		p.querySelector('.dob-tovar').textContent = imya || '';
60		p.className = 'dob-on';
61		clearTimeout(tajmer);
62		tajmer = setTimeout(spryatat, 6000);
63	}
64
65	function schetchik(otvet) {
66		var el = document.getElementById('cart_items');
67		if (!el) return;
68		var m = String(otvet || '').match(/id="cart_items"[^>]*>([^<]*)</);
69		if (m) { el.innerHTML = ' ' + m[1].replace(/\D/g, '') + ' '; return; }
70		var bylo = parseInt((el.innerHTML || '').replace(/\D/g, ''), 10) || 0;
71		el.innerHTML = ' ' + (bylo + 1) + ' ';
72	}
73
74	/* Кладёт товар в корзину и показывает плашку.
75	   url — тот же адрес /order/?…, что стоял в ссылке.
76	   imya — что написать в плашке (необязательно).
77	   zapasnoj — куда уйти, если запрос не прошёл. */
78	function polozhit(url, imya, zapasnoj) {
79		var x = new XMLHttpRequest();
80		x.open('GET', url, true);
81		x.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
82		x.onload = function () {
83			if (x.status >= 200 && x.status < 400) {
84				schetchik(x.responseText);
85				pokazat(imya);
86				if (window.CEL) CEL('v_korzinu', {otkuda: 'katalog'});
87			} else if (zapasnoj !== false) {
88				window.location = zapasnoj || url;
89			}
90		};
91		x.onerror = function () {
92			if (zapasnoj !== false) window.location = zapasnoj || url;
93		};
94		x.send();
95	}
96
97	function imya_tovara(ssylka) {
98		var karta = ssylka.closest ? ssylka.closest('.product_item, .item_collection, .product-scope') : null;
99		var n = karta && karta.querySelector('.product_name');
100		return n ? n.textContent.replace(/\s+/g, ' ').trim() : '';
101	}
102
103	document.addEventListener('click', function (e) {
104		var a = e.target && e.target.closest ? e.target.closest('a') : null;
105		if (!a) return;
106		var href = a.getAttribute('href') || '';
107		if (href.indexOf('/order/?product') !== 0) return;
108		// средняя кнопка и клик с Ctrl/Cmd — пусть работают как обычно
109		if (e.metaKey || e.ctrlKey || e.shiftKey || e.button === 1) return;
110		e.preventDefault();
111		polozhit(href, imya_tovara(a));
112	}, false);
113
114	/* Для кнопок со своим обработчиком: карточка товара и быстрый просмотр. */
115	window.CART_NOTICE = { show: pokazat, add: polozhit, count: schetchik };
116})();

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.