403Webshell
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 :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/js/burlakastudio.realcommenter/browser_hash.js
'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;

}

Youez - 2016 - github.com/yon3zu
LinuXploit