Server IP : 80.87.202.40 / Your IP : 216.73.216.169 Web Server : Apache System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64 User : bitrix ( 600) PHP Version : 8.2.27 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /home/bitrix/ext_www/rospirotorg.ru/bitrix/js/burlakastudio.realcommenter/ |
Upload File : |
'use strict'; /** * Модуль "Полноценные Комментарии D7" под Битрикс * Официальный сайт модуля: www.realcommenter.com * Официальный сайт разработчика: burlaka.studio * Автор и разработчик: Алексей Бурлака (AlexeyGfi) -> alexeygfi@gmail.com */ /** * Push-процессор: * • накапливает историю через pushState * • ведёт стек колбеков * * При входе в пустой стек колбеков сохраняем "наружное" состояние. * • если есть хеш (например #oldhash), инициализируем стек с ключом: * "oldhash" => 'EMPTY' * • если хеша нет, инициализируем стек с ключом: * "" => 'EMPTY' * * Реакция на событие onhashchange (в нашем случае — назад по истории, но возможно влияние снаружи): * ...производим действия только если в стеке есть ОБА ключа — и старый хеш и новый. * (!!!!!!!!!!) Вне зависимости от порядка следования (!!!!!!!!!!) * (!) В качестве ключа может быть пустая строка, если выходим из списка хешей вовсе * • если старый хеш в стеке имеет колбек-функцию, пинаем её * • старый хеш: удаляем * • новый хеш: удаляем, если в качестве значения в хеше значится "EMPTY" * * Back-процессор финализирует каждый onhashchange проверяет: * • если в стеке последним ключом значится ключ (hash_name) с пустым значением, * • если в стеке последним ключом значится callback с пустым значением, * ...пинает history.back(), который запустит заново ветку реакции * * Стек-колбеков: * window.browser_hash_callback_stack= [ * 0: { * hash_name : '' | '#key', * callback : 'EMPTY' * }, * 1: { * hash_name : 'mmenu', * callback : false * }, * 2: { * hash_name : 'float_menu', * callback : function() { ... } * }, * ]; * * Как пользоваться: * • в стек отслеживателя заряжаем хеш и привязанный к нему колбек: * browser_hash_CPU ( '#write_us', write_us_disappear ); * * Отслеживатель сам почистит и хеш и выполнит колбэк-функцию, * если всё пойдёт по сценарию навигация браузера * * • убираем из стека колбэк (с ним вычистится хеш). Если например мы закрываем формочку по клику на крестик. * ...чтобы навигационный бэк не выполнил колбэк дважды: * close_obj.addEventListener( * 'click', * browser_hash_unregister_callback_from_stack.bind( * this, * write_us_disappear * ) * ); * * Это нужно сделать снаружи колбэк-функции. * */ function browser_hash_over_BX_ajax () { try { if (BX.ajax.history.startState) { return true; } } catch(e) { console.log(e); } return false; } // Накопитель истории function browser_hash_CPU (hashName, hashCallback) { // just skip internal branches if (browser_hash_over_BX_ajax()) { return; } if (!hashName || !hashCallback) { return; } hashName = '#' + hashName.replace(/#/g, ''); browser_hash_stack_processor(); window.browser_hash_callback_stack.push( { hash_name: hashName, callback: hashCallback } ); history.pushState({}, '', hashName); } function browser_hash_stack_processor () { if ( typeof window.browser_hash_callback_stack === 'undefined' || !window.browser_hash_callback_stack || !window.browser_hash_callback_stack.length ) { window.browser_hash_callback_stack = []; window.browser_hash_callback_stack.push( { hash_name: location.hash, callback: 'EMPTY' } ); } } // Отслеживатель history.back function browser_hash_observer (e) { var url_old = e.oldURL; var url_new = e.newURL; var hash_old = url_old.search(/#.+$/); var hash_new = url_new.search(/#.+$/); hash_old = (!~hash_old) ? '' : url_old.substr(hash_old); hash_new = (!~hash_new) ? '' : url_new.substr(hash_new); var hash_old_info = browser_hash_detect_from_stack(hash_old); var hash_new_info = browser_hash_detect_from_stack(hash_new); if (hash_old_info && hash_new_info) { if (hash_old_info.callback && hash_old_info.callback instanceof Function) { hash_old_info.callback(); } browser_hash_exclude_from_stack_by_pos(hash_old_info['pos']); /** * 0: { * hash_name : '' | '#key', * callback : 'EMPTY' * }, */ if (hash_new_info['callback'] === 'EMPTY') { window.browser_hash_callback_stack = []; } } //Back-процессор (расчёска) browser_hash_stack_comb(); } window.addEventListener('hashchange', browser_hash_observer); /** * Back-процессор финализирует каждый onhashchange проверяет: * • если в стеке последним ключом значится ключ (hash_name) с пустым значением, * • если в стеке последним ключом значится callback с пустым значением, * ...пинает history.back(), который запустит заново ветку реакции */ function browser_hash_stack_comb () { if (!window.browser_hash_callback_stack.length) { return; } var last_item = window.browser_hash_callback_stack[window.browser_hash_callback_stack.length - 1]; if (!last_item['hash_name'] || !last_item['callback']) { history.back(); } } function browser_hash_detect_from_stack (hash_name) { if (typeof hash_name === 'undefined') { return false; } for (var s = 0; s < window.browser_hash_callback_stack.length; s++) { if (window.browser_hash_callback_stack[s].hash_name == hash_name) { return { pos: s, hash_name: window.browser_hash_callback_stack[s].hash_name, callback: window.browser_hash_callback_stack[s].callback }; } } return false; } function browser_hash_exclude_from_stack_by_pos (pos) { if (typeof pos === 'undefined' || !pos) { return false; } if (typeof window.browser_hash_callback_stack[pos] === 'undefined' || !window.browser_hash_callback_stack[pos]) { return; } window.browser_hash_callback_stack.splice(pos, 1); } function browser_hash_unregister_callback_from_stack (callback) { // just skip internal branches if (browser_hash_over_BX_ajax()) { return; } if (!callback) { return false; } for (var s = 0; s < window.browser_hash_callback_stack.length; s++) { if (window.browser_hash_callback_stack[s].callback === callback) { window.browser_hash_callback_stack[s].callback = false; } } browser_hash_stack_comb(); return false; }