mirror of
https://ghfast.top/https://github.com/zsjy/halo-theme-dream2.0-plus.git
synced 2025-03-16 12:29:41 +08:00
1 line
8.0 KiB
JavaScript
1 line
8.0 KiB
JavaScript
(()=>{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"]()})(); |