1/** 2 * Цели ЯндекÑ.ÐеÑÑики на Ñаги оÑоÑÐ¼Ð»ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ°Ð·Ð°. 3 * 4 * ÐÑоÑмление на виÑÑине â одноÑÑÑаниÑное (Webasyst checkout 2): ÑекÑии 5 * `.wa-step-*-section` живÑÑ Ð½Ð° одной ÑÑÑаниÑе, Ñагов-пеÑÐµÑ Ð¾Ð´Ð¾Ð² неÑ. ÐоÑÑÐ¾Ð¼Ñ 6 * «Ñаг» здеÑÑ â заполненное поле или вÑбÑаннÑй ваÑианÑ, а не Ñмена ÑкÑана. 7 * Ðез ÑÑÐ¸Ñ Ñелей в ÐеÑÑике не ÑобиÑаеÑÑÑ Ð²Ð¾Ñонка и не видно, где оÑваливаÑÑÑÑ. 8 * 9 * СÑÑÑÑик подклÑÑаеÑÑÑ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð¼ `delay` оÑложенно, поÑÑÐ¾Ð¼Ñ Ñели ÑкладÑваÑÑÑÑ 10 * в оÑеÑÐµÐ´Ñ Ð¸ ÑÑ Ð¾Ð´ÑÑ, как ÑолÑко поÑвиÑÑÑ `window.ym`. 11 * 12 * Цели, коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð·Ð°Ð²ÐµÐ´ÐµÐ½Ñ Ð² ÐеÑÑике как «JavaScript-ÑобÑÑие»: 13 * CHECKOUT_OPEN â оÑкÑÑл оÑоÑмление Ñ Ð½ÐµÐ¿ÑÑÑой коÑзиной 14 * CHECKOUT_ADDRESS â ввÑл адÑÐµÑ 15 * CHECKOUT_DATETIME â вÑбÑал даÑÑ Ð¸Ð»Ð¸ инÑеÑвал доÑÑавки 16 * CHECKOUT_CONTACTS â ввÑл ÑелеÑон 17 * CHECKOUT_SUBMIT â нажал «ÐÑоÑмиÑÑ Ð·Ð°ÐºÐ°Ð·Â» 18 * CHECKOUT_ERROR â Ñвидел оÑÐ¸Ð±ÐºÑ Ð² ÑоÑме 19 * CHECKOUT_ZONE_CHANGED â менÑл Ð·Ð¾Ð½Ñ Ð´Ð¾ÑÑавки (подÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð½Ðµ подоÑла) 20 * ORDER â оÑпÑавлÑÐµÑ Ð¿Ð»Ð°Ð³Ð¸Ð½ «E-commerce аналиÑика
20» пÑи Ñоздании заказа 21 */ 22(function () { 23 'use strict'; 24 25 var COUNTER = 102670702; 26 var QUEUE_LIMIT_MS = 30000; 27 28 var pending = []; 29 var already_sent = {}; 30 31 /** ÐÑпÑавлÑÐµÑ ÑÐµÐ»Ñ Ð¾Ð´Ð¸Ð½ Ñаз за загÑÑÐ·ÐºÑ ÑÑÑаниÑÑ; до гоÑовноÑÑи ÑÑÑÑÑика ÐºÐ¾Ð¿Ð¸Ñ Ð¾ÑеÑедÑ. */ 32 function goal(name, params) { 33 if (already_sent[name]) { return; } 34 already_sent[name] = true; 35 pending.push([name, params]); 36 flush(); 37 } 38 39 function flush() { 40 if (typeof window.ym !== 'function') { return; } 41 while (pending.length) { 42 var item = pending.shift(); 43 window.ym(COUNTER, 'reachGoal', item[0], item[1] || undefined); 44 } 45 } 46 47 // СÑÑÑÑик пÑÐ¸ÐµÐ·Ð¶Ð°ÐµÑ Ð²ÑоÑÑм запÑоÑом, поÑÑÐ¾Ð¼Ñ Ð¾ÑеÑÐµÐ´Ñ ÑазбиÑаем по ÑаймеÑÑ. 48 var waiting_since = Date.now(); 49 var waiting = setInterval(function () { 50 flush(); 51 if (typeof window.ym === 'function' || Date.now() - waiting_since > QUEUE_LIMIT_MS) { 52 clearInterval(waiting); 53 } 54 }, 300); 55 56 function filled(selector) { 57 var node = document.querySelector(selector); 58 return !!(node && String(node.value || '').trim()); 59 } 60 61 // Ðона доÑÑавки подÑÑавлена по ÑмолÑÐ°Ð½Ð¸Ñ Ñ Ð²ÑÐµÑ , поÑÑÐ¾Ð¼Ñ Ð¸Ð½ÑеÑеÑен ÑолÑко ÐµÑ 62 // оÑознаннÑй вÑÐ±Ð¾Ñ â Ñо еÑÑÑ Ð¾ÑлиÑие Ð¾Ñ Ñого, ÑÑо ÑÑоÑло пÑи оÑкÑÑÑии ÑоÑмÑ. 63 var initial_zone = null; 64 65 /** СвеÑÑÐµÑ ÑоÑÑоÑние ÑоÑÐ¼Ñ Ñ ÑелÑми: вÑзÑваеÑÑÑ Ð¿Ð¾Ñле каждого изменениÑ. */ 66 function checkProgress() { 67 var zone = document.querySelector('[name="shipping[variant_id]"]'); 68 if (zone && zone.value) { 69 if (initial_zone === null) { 70 initial_zone = zone.value; 71 } else if (zone.value !== initial_zone) { 72 goal('CHECKOUT_ZONE_CHANGED'); 73 } 74 } 75 if (filled('[name="details[shipping_address][street]"]')) { 76 goal('CHECKOUT_ADDRESS'); 77 } 78 if (filled('[name="details[custom][desired_delivery.interval]"]') 79 || filled('[name="details[custom][desired_delivery.date]"]')) { 80 goal('CHECKOUT_DATETIME'); 81 } 82 if (filled('[name="auth[data][phone]"]')) { 83 goal('CHECKOUT_CONTACTS'); 84 } 85 } 86 87 function watchCheckout(wrapper) { 88 goal('CHECKOUT_OPEN'); 89 90 document.addEventListener('change', checkProgress, true); 91 document.addEventListener('blur', checkProgress, true); 92 93 document.addEventListener('click', function (e) { 94 if (e.target.closest && e.target.closest('.js-submit-order-button, .js-submit-confirm')) { 95 goal('CHECKOUT_SUBMIT'); 96 } 97 }, true); 98 99 // СекÑии ÑоÑÐ¼Ñ Ð¿ÐµÑеÑиÑовÑваÑÑÑÑ Ð¾ÑвеÑом ÑеÑвеÑа, без ÑобÑÑий на полÑÑ : 100 // Ð·Ð¾Ð½Ñ Ð´Ð¾ÑÑавки и оÑибки видно ÑолÑко по Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑазмеÑки. ÐеÑеÑиÑовка 101 // идÑÑ Ð¿Ð°Ñками, поÑÑÐ¾Ð¼Ñ Ð¿ÑовеÑÑем не ÑаÑе Ñаза в 300 мÑ. 102 var recheck_timer = null; 103 new MutationObserver(function () { 104 if (!recheck_timer) { 105 recheck_timer = setTimeout(function () { 106 recheck_timer = null; 107 checkProgress(); 108 }, 300); 109 } 110 111 var error = document.querySelector('.wa-error-text, .wa-error'); 112 if (!error) { return; } 113 var section = error.closest('[class*="wa-step-"]'); 114 goal('CHECKOUT_ERROR', { 115 section: section ? (section.className.match(/wa-step-([a-z]+)-section/) || [])[1] : 'unknown', 116 text: (error.textContent || '').trim().slice(0, 100) 117 }); 118 }).observe(wrapper, { childList: true, subtree: true }); 119 120 checkProgress(); 121 } 122
123 function init() { 124 // СкÑÐ¸Ð¿Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑй, но нÑжен ÑолÑко на оÑоÑмлении и ÑÑÑаниÑе ÑÑÐ¿ÐµÑ Ð°. 125 if (!/\/(order|checkout)(\/|$)/.test(location.pathname)) { return; } 126 127 if (/\/checkout\/success/.test(location.pathname) 128 || document.querySelector('.wa-order-success, .order-success')) { 129 goal('CHECKOUT_SUCCESS_PAGE'); 130 return; 131 } 132 var wrapper = document.querySelector('.wa-order-form-wrapper'); 133 if (wrapper) { watchCheckout(wrapper); return; } 134 135 // ФоÑма оÑоÑÐ¼Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾ÑиÑовÑваеÑÑÑ ÑкÑипÑом â ждÑм ÐµÑ Ð¿Ð¾ÑвлениÑ. 136 var waiting_form = new MutationObserver(function () { 137 var w = document.querySelector('.wa-order-form-wrapper'); 138 if (w) { waiting_form.disconnect(); watchCheckout(w); } 139 }); 140 waiting_form.observe(document.body, { childList: true, subtree: true }); 141 setTimeout(function () { waiting_form.disconnect(); }, QUEUE_LIMIT_MS); 142 } 143 144 if (document.readyState === 'loading') { 145 document.addEventListener('DOMContentLoaded', init); 146 } else { 147 init(); 148 } 149})();
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.