如何给matery主题添加Pjax?

Pjax优点

1.减轻服务端压力

2.按需请求,每次只需加载页面的部分内容,而不用重复加载一些公共的资源文件和不变的页面结构,大大减小了数据请求量,以减轻对服务器的带宽和性能压力,还大大提升了页面的加载速度。

优化页面跳转体验

3.使用pjax后,只刷新部分页面,切换效果更加流畅,而且可以定制过度动画,在等待页面加载的时候体验就比较舒服了。

我知道你们在意的是教程不是这些啰嗦的废话,下面就是正文

教程

基本了解

Pjax的使用可以在保证Nav Header Footer不变的基础上改变Main的内容(适用于页面结构相对简单的主体)

步骤

新建pjax.ejs

_widget 目录下新建pjax.ejs文件

<%if(theme.pjax){%>
<script type="text/javascript">
$.getScript("https://cdn.jsdelivr.net/npm/pjax/pjax.min.js",loadPjax)
function loadPjax(){
var pjax = new Pjax({
selectors: [
"head title",
'head meta[name="keywords"]',
'head meta[name="description"]',
"main#main_wrap"
],
cache: true,
cacheBust: false
});
} // Pjax请求错误时,跳转到404页面
document.addEventListener('pjax:error', (err) => {
if (err.request.status === 404) {
pjax.loadUrl('/404.html')
}
})
</script>
<%}%>
添加容器

找到layout.eje<%- body %> 套一个 <main> 标签

<main id="main_wrap">
<%- body %>
</main>
引入pjax.ejs

找到 layout.ejs 在底部(首次加载没必要优先加载Pjax)添加

<% if (theme.pjax.enable) { %>
<%- partial('_widget/pjax') %>
<% } %>

此处添加一个判断条件,为后面_config.yml的配置作准备

添加pjax开关

themes\_config.yml中添加

pjax: true

bug的解决

由于Pjax会导致容器内的函数不会重载,要重载一下函数

在此仅提供重载方法,不一一做演示了

部分修改页面

由于时间问题,仅提供一些需要修改的 ejs 内容作为参考

  • 评论页面ejs(我使用的是valine,故我需要将valine.ejs页面进行修改)
  • 谷歌统计页面(google-analytics.ejs)
  • 文章目录(post-detail-toc.ejs)
  • 说说页面(artitalk.ejs)
  • 标签页面(tags)的词云(tag-wordcloud.ejs)
  • 分类页面(categories)雷达图(category-radar.ejs)
  • 归档页面(archives)统计图(post-calendar.ejs)
  • 关于页面(about)的统计图(post-charts.ejs)

欢迎提交遗漏bug

标签 (tags)页面为例

当操作完以上步骤后从首页点进标签(tags)页面时会有一下报错

打开tags.ejs该页面由 tag-cloud tag-wordcloud 两个ejs组成,故要查看这两个 ejs 页面哪里出现了 jQCloud 函数

找到bug处进行修改

  • 原页面
<link rel="stylesheet" type="text/css" href="<%- theme.jsDelivr.url %><%- url_for(theme.libs.css.jqcloud) %>">
<div class="container" style="padding-bottom: 20px" data-aos="fade-up">
<div id="tag-wordcloud" class="card-content"></div>
</div> <script type="text/javascript" src="<%- theme.jsDelivr.url %><%- url_for(theme.libs.js.jqcloud) %>"></script>
<script type="text/javascript">
<%
let tagWordArr = [];
site.tags.map(function(tag) {
tagWordArr.push({'text': tag.name, 'weight': tag.length, 'link': decodeURI(url_for(tag.path))});
}); let tagWords = JSON.stringify(tagWordArr);
%> $('#tag-wordcloud').jQCloud(<%- tagWords %>, {
autoResize: true
});
</script>
  • 修改后
<link rel="stylesheet" type="text/css" href="<%- theme.jsDelivr.url %><%- url_for(theme.libs.css.jqcloud) %>">
<style type="text/css">
#tag-wordcloud {
width: 100%;
height: 300px;
}
</style> <div class="container" data-aos="fade-up">
<div class="card">
<div id="tag-wordcloud" class="card-content"></div>
</div>
</div> <script type="text/javascript">
$.getScript("<%- theme.jsDelivr.url %><%- url_for(theme.libs.js.jqcloud) %>",function () {
<%
let tagWordArr = [];
site.tags.map(function(tag) {
tagWordArr.push({'text': tag.name, 'weight': tag.length, 'link': decodeURI(url_for(tag.path))});
}); let tagWords = JSON.stringify(tagWordArr);
%> $('#tag-wordcloud').jQCloud(<%- tagWords %>, {
autoResize: true
});
})
</script>

修改内容:将未重载的函数利用 Jquery 的 getScript 方法进行重载

$.getScript("文件引用路径",function(){
//重载函数
})

推荐

页面切换加载动画

pjax.ejsscript 标签中添加以下代码

// 清除时间
var timer = null;
// 执行进度条
function ProgressStart(){
// 设置初始进度
var progress = 10;
// 创建进度条 及 css样式
var div = document.createElement('div');
div.className = "pjax_progress";
document.body.prepend(div);
// 定义随机数最大值最小值
var max=10,mini=3;
var result=max-mini;
// 清除
clearInterval(timer);
// 0.5秒内累加进度
timer = setInterval(function(){
// 随机数
var num = parseInt(Math.random()*result);
var randomResult = num+mini;
// 累加
progress+=randomResult
$queryAll(".pjax_progress")[0].style.width = progress+"%";
// 当进度达到95%时停止
if(progress>95)progress=95
},500)
}
// 加载进度条加载完毕
function ProgressFinish(){
clearInterval(timer);
// 页面加载完毕后进度100% 并在0.7秒后删除
var progress = $queryAll(".pjax_progress");
progress[0].style.width = "100%";
timer = setTimeout(function () {
progress[0].parentNode.removeChild(progress[0])
}, 700);
}
// 开始 PJAX 执行的函数
document.addEventListener('pjax:send', function () {
// 执行进度条
ProgressStart()
});
// PJAX 完成之后执行的函数,可以和上面的重载放在一起
document.addEventListener('pjax:complete', function () {
// 加载进度条加载完毕
ProgressFinish()
});

my.css 中添加以下样式代码

.pjax_progress{
position: fixed;
top: 0;
left: 0;
width: 10%;
height: 2px;
z-index: 103;
background: linear-gradient(130deg, #ff0, red);
transition: width .4s ease 0s;
}

页面切换加载进度条

pjax.ejsscript标签中添加以下代码

#loading {
position: fixed;
top: 0;
left: 0;
min-height: 100vh;
width: 100vw;
z-index: 9999;
display: none;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
}
#loading .loader {
width: 20em;
height: 20em;
font-size: 10px;
position: relative;
display: flex;
align-items: center;
justify-content: center;
}
#loading .loader .face {
position: absolute;
border-radius: 50%;
border-style: solid;
animation: CW 3s linear infinite;
}
#loading .loader .face:nth-child(1) {
width: 100%;
height: 100%;
color: #ffd700;
border-color: currentColor transparent transparent currentColor;
border-width: 0.2em 0.2em 0 0;
--deg: -45deg;
animation-direction: normal;
}
#loading .loader .face:nth-child(2) {
width: 70%;
height: 70%;
color: #0f0;
border-color: currentColor currentColor transparent transparent;
border-width: 0.2em 0 0 0.2em;
--deg: -135deg;
animation-direction: reverse;
}
#loading .loader .face .circle {
position: absolute;
width: 50%;
height: 0.1em;
top: 50%;
left: 50%;
background-color: transparent;
transform: rotate(var(--deg));
transform-origin: left;
}
#loading .loader .face .circle::before {
position: absolute;
top: -0.5em;
right: -0.5em;
content: '';
width: 1em;
height: 1em;
background-color: currentColor;
border-radius: 50%;
box-shadow: 0 0 2em, 0 0 4em, 0 0 6em, 0 0 8em, 0 0 10em, 0 0 0 0.5em rgba(255,255,0,0.1);
}

Matery主题添加Pjax的更多相关文章

  1. 044. asp.net主题之二为主题添加CSS样式和动态加载主题

    1. 新建任意一个网站, 默认主页为Default.aspx, 增加一个App_Themes目录, 用于存储主题, 添加一个MyTheme的主题, 在MyTheme主题下添加一个样式表文件, 默认名称 ...

  2. Mysql远程连接,并解决wordp主题添加问题

    1.增加允许远程连接 MySQL 用户并授权. 在 Linux 主机中在命令提示行下输入下面的命令. > MySQL -uroot -p 密码 2.创建远程登陆用户并授权 grant all P ...

  3. Hexo博客maupassant主题添加Google Adsense广告

    自从在 Github Page 落户以后,很长一段时间使用的是极简且有点艺术范儿的 fexo 主题,而不是大名鼎鼎的 next 主题.后来偶然发现了符合我审美的Hexo博客 maupassant 主题 ...

  4. 为Hexo Next主题添加分享及打赏功能

    博客地址:往事亦如风的博客 要想先看打赏和分享功能效果,请移步我的博客 打赏功能 因为next主题自带打赏功能,所以我们只需要在next的主题配置文件中找到如下代码,image文件夹是我在blog/s ...

  5. Orchard运用 - 特定主题添加独立代码文件

    今天继续跟大家分享捣鼓Orchard的一些心得.其实有时一些问题或者Bugs还是蛮好解决的,主要看你采取哪种方式方法.比如有时我们为了扩展某些特性或功能,你可以搭建一个全新的模块来完成,如果临时的或简 ...

  6. Hexo NexT主题添加点击爱心效果

    给NexT主题内添加页面点击出现爱心的效果 创建js文件 在/themes/next/source/js/src下新建文件clicklove.js,接着把该链接下的代码拷贝粘贴到clicklove.j ...

  7. 给hexo博客的NEXT主题添加一个云日历

    一点废话 hexo中有文件的归档,但是博文的数目多了,浏览的时候也是很不方便的.于是我就有找个云日历的想法了,折腾了几天,网上的方法都试过了.但是没出效果.于是想着自己来写一个.这自己写的这部分是基于 ...

  8. Hexo next主题添加站内搜索功能

    根据关键字搜索博文,站内搜索的功能很实用.hexo开启站内搜索很方便,已经有现成的插件可以使用,也是为了方便自己 安装插件 npm install hexo-generator-search --sa ...

  9. 在next主题添加微信公众号二维码

    在侧边栏添加微信公众号二维码 首先,当然是准备一张微信公众号二维码.有两种添加方式,添加到侧边栏或者添加到推文的结尾处.我的next主题是7.x版本的,使用的主题是Gemini,设置的侧栏显示方式是一 ...

随机推荐

  1. npm版本兼容导致的npm ERR! ERESOLVE unable to resolve dependency tree

    当团队项目中,团队成员的npm包管理工具版本不一致时执行npm install报错: npm -v查看版本信息:7.x与6.x之间的兼容问题 解决方案: 一:升级或降级npm版本,保持一致npm in ...

  2. javaweb获取客户端真实ip

    在安全性要求较高的web项目中,我们经常有这样的需求: 黑名单:禁止指定ip访问. 白名单:允许指定ip访问. 根据ip追踪恶意入侵系统者. 在java中我们通常可以这样获取客户端ip地址: requ ...

  3. 【图解源码】Zookeeper3.7源码分析,包含服务启动流程源码、网络通信源码、RequestProcessor处理请求源码

    Zookeeper3.7源码剖析 能力目标 能基于Maven导入最新版Zookeeper源码 能说出Zookeeper单机启动流程 理解Zookeeper默认通信中4个线程的作用 掌握Zookeepe ...

  4. 关于各种Vue UI框架中加载进度条的正确使用

    这里拿MUSE UI 中的进度条举例 <mu-circular-progress :size="40" class="icon" v-if="i ...

  5. Node.js精进(4)——事件触发器

    Events 是 Node.js 中最重要的核心模块之一,很多模块都是依赖其创建的,例如上一节分析的流,文件.网络等模块. 比较知名的 Express.KOA 等框架在其内部也使用了 Events 模 ...

  6. 多台云服务器的 Kubernetes 集群搭建

    环境 两台或多台腾讯云服务器(本人搭建用了两台),都是 CentOs 7.6, master 节点:服务器为 4C8G,公网 IP:124.222.61.xxx node1节点:服务器为 4C4G,公 ...

  7. 几百行代码实现一个 JSON 解析器

    前言 之前在写 gscript时我就在想有没有利用编译原理实现一个更实际工具?毕竟真写一个语言的难度不低,并且也很难真的应用起来. 一次无意间看到有人提起 JSON 解析器,这类工具充斥着我们的日常开 ...

  8. NC50528 滑动窗口

    NC50528 滑动窗口 题目 题目描述 给一个长度为N的数组,一个长为K的滑动窗体从最左端移至最右端,你只能看到窗口中的K个数,每次窗体向右移动一位,如下图: 你的任务是找出窗体在各个位置时的最大值 ...

  9. NC200190 矩阵消除游戏

    NC200190 矩阵消除游戏 题目 题目描述 牛妹在玩一个名为矩阵消除的游戏,矩阵的大小是 \({n}\) 行 \({m}\) 列,第 \({i}\) 行第 \({j}\) 列的单元格的权值为 \( ...

  10. SLSA 框架与软件供应链安全防护

    随着软件供应链攻击浪潮愈演愈烈,Google 发布了一系列指南来确保软件包的完整性,旨在防止影响软件供应链的未经授权的代码修改.新的 Google SLSA 框架(Supply-chain Level ...