2024-05-07 12:31:42 +08:00

1 line
8.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(()=>{var __webpack_modules__={"./src/js/pjax.js":()=>{eval("const cssLoadCompletes = new Set($('link[href*=\".css\"]').map((i, item) => $(item).attr('href')).get())\r\nconst jsLoadCompletes = new Set($('script[src*=\".js\"]').map((i, item) => $(item).attr('src')).get())\r\n\r\n// 为pjax请求创建一个序列号\r\nconst createSerialNumber = () => {\r\n const serialNumber = new Date().getTime()\r\n window.pjaxSerialNumber = serialNumber\r\n console.log(`sn = ${serialNumber}`)\r\n return serialNumber\r\n}\r\n// pjax请求时进行界面预处理\r\nconst initPjax = () => {\r\n}\r\n\r\nconst computeScrollTop = (target) => {\r\n // 当前为横幅大图模式,处理滚动\r\n if (target.pathname !== '/' && $('.banner').length !== 0) {\r\n // 避免跳转时顶部导航栏收缩\r\n window.initTop = 99999999\r\n return window.innerHeight / 4\r\n }\r\n return 0\r\n}\r\n\r\nconst syncLoadScripts = ($scripts, i, resolve) => {\r\n if (i >= $scripts.length) {\r\n resolve && resolve()\r\n return\r\n }\r\n let src = $($scripts[i]).attr('src')\r\n if (jsLoadCompletes.has(src)) {\r\n syncLoadScripts($scripts, i + 1, resolve)\r\n return\r\n }\r\n console.log((resolve ? '同步' : '异步') + '顺序加载js ' + src)\r\n Utils.cachedScript(src)\r\n .done(function () {\r\n console.log((resolve ? '同步' : '异步') + '顺序加载js完成 ' + src)\r\n jsLoadCompletes.add(src)\r\n window.DProgress && DProgress.inc()\r\n syncLoadScripts($scripts, i + 1, resolve)\r\n })\r\n .fail(function () {\r\n console.log((resolve ? '同步' : '异步') + '顺序加载js失败 ' + src)\r\n syncLoadScripts($scripts, i + 1, resolve)\r\n })\r\n}\r\n\r\n/**\r\n * 第二个参数是容器,即将被替换的内容\r\n * fragment:是加载的文本中被选中的目标内容\r\n */\r\n$(document).on('click', 'a[target!=_blank][href]:not(data-not-pjax)', (event) => {\r\n $.pjax.click(event, '.column-main', {\r\n scrollTo: computeScrollTop(event.currentTarget),\r\n fragment: '.column-main',\r\n serialNumber: createSerialNumber(),\r\n timeout: 8000,\r\n })\r\n})\r\n\r\n\r\n$(document).on('submit', 'form[data-pjax]', function (event) {\r\n $.pjax.submit(event, '.column-main', {\r\n scrollTo: 0,\r\n fragment: '.column-main',\r\n serialNumber: createSerialNumber(),\r\n timeout: 8000,\r\n })\r\n})\r\n\r\n$(document).on('pjax:click', function (event, options) {\r\n console.log('------------------------')\r\n console.log(`pjax:click sn = ${options.serialNumber}`)\r\n})\r\n\r\n$(document).on('pjax:beforeSend', function (event, xhr, options) {\r\n console.log(`pjax:beforeSend sn = ${options.serialNumber}`)\r\n $('html').addClass('pjax-loading')\r\n})\r\n\r\n$(document).on('pjax:start', function (event, xhr, options) {\r\n console.log(`pjax:start sn = ${options.serialNumber}`)\r\n window.DProgress && DProgress.start()\r\n $('.pjax-close').remove()\r\n})\r\n\r\n$(document).on('pjax:send', function (event, xhr, options) {\r\n console.log(`pjax:send sn = ${options.serialNumber}`)\r\n})\r\n\r\n$(document).on('pjax:clicked', function (event, options) {\r\n console.log(`pjax:clicked sn = ${options.serialNumber}`)\r\n})\r\n\r\n/**\r\n * pjax加载和浏览器前进后退都会触发的事件\r\n * 在此处需要进行一些未进行pjax也需要执行的程序\r\n */\r\n$(document).on('pjax:beforeReplace', function (event, contents, options) {\r\n console.log(`pjax:beforeReplace sn = ${options.serialNumber}`)\r\n /* 重新初始化导航条高亮 */\r\n $('.navbar-nav .current,.panel-side-menu .current').removeClass('current')\r\n commonContext.initNavbar()\r\n /* 移动端关闭抽屉弹窗 */\r\n $('html.disable-scroll').length > 0 && $('.navbar-mask').trigger('click')\r\n})\r\n\r\n/**\r\n * pjax 替换内容成功之后\r\n * 浏览器前进后退时不会执行\r\n */\r\n$(document).on('pjax:success', async function (event, data, status, xhr, options) {\r\n const serialNumber = options.serialNumber\r\n console.log(`pjax:success sn = ${serialNumber}`)\r\n if (window.pjaxSerialNumber !== serialNumber) return\r\n /* 重新激活图片预览功能 */\r\n commonContext.initGallery()\r\n /* 重新加载目录和公告 */\r\n commonContext.initTocAndNotice()\r\n /* 初始化pjax加载 */\r\n initPjax()\r\n /* 已经完成页面渲染 */\r\n $('html').removeClass('pjax-loading')\r\n\r\n const $currentTarget = $($.parseHTML(data, document, true))\r\n const $head = $('head')\r\n $head.find('meta').remove()\r\n $head.find('link[rel=\"canonical\"]').remove()\r\n $head.append($currentTarget.filter('meta'))\r\n $head.append($currentTarget.filter('link[rel=\"canonical\"]'))\r\n $currentTarget.filter('link[data-pjax]').each(function () {\r\n let href = $(this).attr('href')\r\n if (!cssLoadCompletes.has(href)) {\r\n $head.append($(this))\r\n console.log('加载css ' + $(this).attr('href'))\r\n this.onload = function () {\r\n cssLoadCompletes.add(href)\r\n window.DProgress && DProgress.inc()\r\n console.log('加载css完成 ' + $(this).attr('href'))\r\n }\r\n }\r\n })\r\n let $scripts = $currentTarget.filter('script[data-pjax]')\r\n if ($scripts.length > 0) {\r\n $scripts.filter('[async]').each(function () {\r\n let src = $(this).attr('src')\r\n if (jsLoadCompletes.has(src)) {\r\n return\r\n }\r\n console.log('异步无序加载js ' + src)\r\n Utils.cachedScript(src)\r\n .done(function () {\r\n console.log('异步无序js完成 ' + src)\r\n window.DProgress && DProgress.inc()\r\n jsLoadCompletes.add(src)\r\n })\r\n .fail(function () {\r\n console.log('异步无序js失败 ' + src)\r\n })\r\n })\r\n new Promise(() => {\r\n syncLoadScripts($scripts.filter('[defer]'), 0)\r\n })\r\n let $syncScripts = $scripts.filter(':not([async]):not([defer])')\r\n $syncScripts.length > 0 && await new Promise((resolve) => {\r\n syncLoadScripts($syncScripts, 0, resolve)\r\n })\r\n }\r\n console.log('全部处理完成')\r\n if (window.pjaxSerialNumber !== serialNumber) return\r\n /* 初始化日志界面 */\r\n window.journalPjax && window.journalPjax(serialNumber)\r\n /* 初始化文章界面 */\r\n window.postPjax && window.postPjax(serialNumber)\r\n /* 刷新人生倒计时 */\r\n commonContext.initTimeCount()\r\n /* 初始化轮播 */\r\n commonContext.initCarousel()\r\n window.DProgress && DProgress.done()\r\n})\r\n\r\n$(document).on('pjax:timeout', function (event, xhr, options) {\r\n console.log(`pjax:timeout sn = ${options.serialNumber}`)\r\n})\r\n\r\n$(document).on('pjax:error', function (event, xhr, textStatus, error, options) {\r\n console.log(`pjax:error sn = ${options.serialNumber} error ${error}`)\r\n})\r\n\r\n// pjax结束\r\n$(document).on('pjax:complete', function (event, xhr, textStatus, options) {\r\n console.log(`pjax:complete sn = ${options.serialNumber}`)\r\n})\r\n\r\n/**\r\n * pjax结束无论是pjax加载还是浏览器前进后退都会被调用\r\n * 浏览器前进后退时,唯一一个在渲染后被调用的方法\r\n */\r\n$(document).on('pjax:end', function (event, xhr, options) {\r\n console.log(`pjax:end sn = ${options.serialNumber}`)\r\n // 如果是浏览器前进后退\r\n if (xhr == null) {\r\n /* 重新加载目录和公告 */\r\n commonContext.initTocAndNotice()\r\n /* 初始化pjax加载 */\r\n initPjax()\r\n /* 初始化轮播 */\r\n commonContext.initCarousel()\r\n /* 刷新人生倒计时 */\r\n commonContext.initTimeCount()\r\n window.DProgress && DProgress.done()\r\n // 应该是由于浏览器缓存失效有时候浏览器前后退还是会执行pjax:beforeSend\r\n $('html').removeClass('pjax-loading')\r\n }\r\n})\r\n\r\n$(document).on('pjax:popstate', function (event) {\r\n console.log('pjax:popstate')\r\n})\r\n\n\n//# sourceURL=webpack://halo-theme-dream2.0-plus/./src/js/pjax.js?")}},__webpack_exports__={};__webpack_modules__["./src/js/pjax.js"]()})();