![]() System : Linux absol.cf 5.4.0-198-generic #218-Ubuntu SMP Fri Sep 27 20:18:53 UTC 2024 x86_64 User : www-data ( 33) PHP Version : 7.4.33 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, Directory : /var/www/html/libs/absol-acomp/demo/ |
Upload File : |
//demo: https://absol.cf/libs/absol-acomp/demo/history.html //doc: https://absol.cf/libs/absol-doc/?page=Other_HistoryHelper var HistoryHelper = {}; window.HistoryHelper = window.HistoryHelper || HistoryHelper;//assign to global if code is module HistoryHelper._stack = []; HistoryHelper._id = 1; /*** * * current state info(exculde hock without url) * @type {{id: number, callback: function, bundle: any}} */ Object.defineProperty(HistoryHelper, 'current', { get: function () { var holder; for (var i = HistoryHelper._stack.length - 1; i >= 0; --i) { holder = HistoryHelper._stack[i]; if (!holder.preventBack) return holder; } return null; } }) HistoryHelper._onpopstate = function (event) { var state = event.state; if (!state || state.of !== 'HISTORY_HELPER') { HistoryHelper.current = null; return; } var idx; if (state.id === "EMPTY") { idx = HistoryHelper._stack.findIndex(function (holder) { return holder.id === state.ref; }); if (idx > 0) { HistoryHelper.current = HistoryHelper._stack[idx]; } else { // setTimeout(function (){ window.history.back(); // }, 10); } return; } idx = HistoryHelper._stack.findIndex(function (holder) { return holder.id === state.id; }); if (idx < 0) { history.back(); return; } var holder = HistoryHelper._stack[idx]; if (holder.preventBack) { if (typeof holder.callback === "function") { holder.callback(holder.bundle); } window.history.pushState({ id: 'EMPTY', ref: holder.id, of: 'HISTORY_HELPER' }, ''); } else { HistoryHelper._stack.splice(idx, HistoryHelper._stack.length - idx) .forEach(function (holder) { delete HistoryHelper._id[holder.id]; }); HistoryHelper.current = HistoryHelper._stack[HistoryHelper._stack.length - 1] || null; if (typeof holder.callback === "function") { holder.callback(holder.bundle); } // setTimeout(function (){ window.history.back(); // }, 10); } }; window.addEventListener('popstate', HistoryHelper._onpopstate, true); /*** * * @param {string} newURL * @param {function(bundle:any):void} callbackFunc * @param {any=} bundle - optional, everthing you want to recive in callbackFunc * @return {number} */ HistoryHelper.setNewLink = function (newURL, callbackFunc, bundle) { var id = HistoryHelper._id++; var currentState = history.state; window.history.pushState({ id: id, of: 'HISTORY_HELPER' }, '', newURL); window.history.pushState({ id: 'EMPTY', ref: id, of: 'HISTORY_HELPER' }, ''); var holder = { id: id, callback: callbackFunc, url: newURL, preventBack: false, bundle: bundle }; HistoryHelper._stack.push(holder); HistoryHelper.current = holder; return id; }; HistoryHelper.deleteHandle = function (handle) { var idx = HistoryHelper._stack.findIndex(function (holder) { return holder.id === handle; }); if (idx >= 0) { HistoryHelper._stack.splice(idx, 1); if (window.history.state && (window.history.state.id === handle || window.history.state.ref === handle)) window.history.back(); } }; /*** * * @param {function(bundle:any):void} callbackFunc * @param {any=} bundle - optional, everthing you want to recive in callbackFunc * @return {number} */ HistoryHelper.hook = function (callbackFunc, bundle) { var id = HistoryHelper._id++; window.history.pushState({ id: id, of: 'HISTORY_HELPER' }, ''); window.history.pushState({ id: 'EMPTY', ref: id, of: 'HISTORY_HELPER' }, ''); var holder = { id: id, callback: callbackFunc, bundle: bundle, preventBack: true }; HistoryHelper._stack.push(holder); return id; };