本教程仅适合有一定JS&&PHP基础的人员,小白请绕道自带Pjax主题。
Pjax是对Ajax + PushState的封装,让访客访问网站不需刷新页面。
同时支持了缓存和本地存储,下次访问的时候直接读取本地数据,无需再次访问。
并且提供了丰富的拓展接口供调用。
一:准备工作
检查你的网站是否引入1.7.0版本以上的jquery,如果没有请引入(一般网站都有)
<script crossorigin="anonymous" integrity="sha384-vk5WoKIaW/vJyUAd9n/wmopsmNhiy+L2Z+SBxGYnUkunIxVxAv/UtMOhba/xskxh" src="//lib.baomitu.com/jquery/3.4.1/jquery.min.js"></script>
二:开始整合
在网站</body>前引入 jquery.pjax.js
<script crossorigin="anonymous" integrity="sha384-VLg3MPOy+5T9leB7r4BBB56zHq4/e0We8vujbAvJwp3xNDhj3b7Fg6+jOVs6bym1" src="//lib.baomitu.com/jquery.pjax/2.0.1/jquery.pjax.min.js"></script>
三:使用Pjax
<script>
$(document).pjax('a[target!=_blank]', '#container', {
fragment: '#container',
timeout: 10000
});
</script>
这句话是什么意思呢?对本页面所有非新窗口打开的链接Pjax加载,链接点击之后,替换id为container的容器的内容为新页面id为container的容器的内容,超时时间10秒;
OK,这样就可以完成主体部分的Pjax,你需要做的就是修改container为直接网站的主体容器,保存。什么?你的网站没有。那就自己div一个。
现在看看,是否可以无刷新加载了?
接下来处理搜索与评论的Pjax
首先你需要知道搜索表单的id值,右键审查元素查看,修改searchform为你自己的id。container和上面一样修改成自己的主体容器id。
若主题没有评论ajax可以直接将#searchform改成form绑定所有表单
$(document).on('submit', '#searchform', function(event) {
$.pjax.submit(event, '#container', {
fragment: '#container',
timeout: 10000
});
});
四:为Pjax加入动画
一个简单的例子
<div class='loader'>
<div class='loader_overlay'></div>
<div class='loader_cogs'>
<div class='loader_cogs__top'>
<div class='top_part'></div>
<div class='top_part'></div>
<div class='top_part'></div>
<div class='top_hole'></div>
</div>
<div class='loader_cogs__left'>
<div class='left_part'></div>
<div class='left_part'></div>
<div class='left_part'></div>
<div class='left_hole'></div>
</div>
<div class='loader_cogs__bottom'>
<div class='bottom_part'></div>
<div class='bottom_part'></div>
<div class='bottom_part'></div>
<div class='bottom_hole'></div>
</div>
<p>Loading</p>
</div>
</div>
<script>
$(document).on('pjax:send', function() {
$(".loader").css("display", "block") //显示加载动画
});
$(document).on('pjax:complete', function() {
$(".loader").css("display", "none") //隐藏加载动画
});
</script>
CSS部分
@charset "utf-8";
/*
Loader CSS
*/
body .loader {
position: fixed;
top: 0;
left: 0;
z-index: 99999;
display: none;
width: 100%;
height: 100%;
background-color: rgba(255, 255, 255, .2);
text-align: center;
font-size: 2em
}
body .loader_overlay {
width: 150px;
height: 150px;
background: transparent;
box-shadow: 0px 0px 0px 1000px rgba(255, 255, 255, 0.67), 0px 0px 19px 0px rgba(0, 0, 0, 0.16) inset;
border-radius: 100%;
z-index: -1;
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
margin: auto;
}
body .loader_cogs {
z-index: -2;
width: 100px;
height: 100px;
top: -120px !important;
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
margin: auto;
}
body .loader_cogs__top {
position: relative;
width: 100px;
height: 100px;
-webkit-transform-origin: 50px 50px;
transform-origin: 50px 50px;
-webkit-animation: rotate 10s infinite linear;
animation: rotate 10s infinite linear;
}
body .loader_cogs__top div:nth-of-type(1) {
-webkit-transform: rotate(30deg);
transform: rotate(30deg);
}
body .loader_cogs__top div:nth-of-type(2) {
-webkit-transform: rotate(60deg);
transform: rotate(60deg);
}
body .loader_cogs__top div:nth-of-type(3) {
-webkit-transform: rotate(90deg);
transform: rotate(90deg);
}
body .loader_cogs__top div.top_part {
width: 100px;
border-radius: 10px;
position: absolute;
height: 100px;
background: #f98db9;
}
body .loader_cogs__top div.top_hole {
width: 50px;
height: 50px;
border-radius: 100%;
background: white;
position: absolute;
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
margin: auto;
}
body .loader_cogs__left {
position: relative;
width: 80px;
-webkit-transform: rotate(16deg);
transform: rotate(16deg);
top: 28px;
-webkit-transform-origin: 40px 40px;
transform-origin: 40px 40px;
-webkit-animation: rotate_left 10s .1s infinite reverse linear;
animation: rotate_left 10s .1s infinite reverse linear;
left: -24px;
height: 80px;
}
body .loader_cogs__left div:nth-of-type(1) {
-webkit-transform: rotate(30deg);
transform: rotate(30deg);
}
body .loader_cogs__left div:nth-of-type(2) {
-webkit-transform: rotate(60deg);
transform: rotate(60deg);
}
body .loader_cogs__left div:nth-of-type(3) {
-webkit-transform: rotate(90deg);
transform: rotate(90deg);
}
body .loader_cogs__left div.left_part {
width: 80px;
border-radius: 6px;
position: absolute;
height: 80px;
background: #97ddff;
}
body .loader_cogs__left div.left_hole {
width: 40px;
height: 40px;
border-radius: 100%;
background: white;
position: absolute;
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
margin: auto;
}
body .loader_cogs__bottom {
position: relative;
width: 60px;
top: -65px;
-webkit-transform-origin: 30px 30px;
transform-origin: 30px 30px;
-webkit-animation: rotate_left 10.2s .4s infinite linear;
animation: rotate_left 10.2s .4s infinite linear;
-webkit-transform: rotate(4deg);
transform: rotate(4deg);
left: 79px;
height: 60px;
}
body .loader_cogs__bottom div:nth-of-type(1) {
-webkit-transform: rotate(30deg);
transform: rotate(30deg);
}
body .loader_cogs__bottom div:nth-of-type(2) {
-webkit-transform: rotate(60deg);
transform: rotate(60deg);
}
body .loader_cogs__bottom div:nth-of-type(3) {
-webkit-transform: rotate(90deg);
transform: rotate(90deg);
}
body .loader_cogs__bottom div.bottom_part {
width: 60px;
border-radius: 5px;
position: absolute;
height: 60px;
background: #ffcd66;
}
body .loader_cogs__bottom div.bottom_hole {
width: 30px;
height: 30px;
border-radius: 100%;
background: white;
position: absolute;
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
margin: auto;
}
/* Animations */
@-webkit-keyframes rotate {
from {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
to {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes rotate {
from {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
to {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@-webkit-keyframes rotate_left {
from {
-webkit-transform: rotate(16deg);
transform: rotate(16deg);
}
to {
-webkit-transform: rotate(376deg);
transform: rotate(376deg);
}
}
@keyframes rotate_left {
from {
-webkit-transform: rotate(16deg);
transform: rotate(16deg);
}
to {
-webkit-transform: rotate(376deg);
transform: rotate(376deg);
}
}
@-webkit-keyframes rotate_right {
from {
-webkit-transform: rotate(4deg);
transform: rotate(4deg);
}
to {
-webkit-transform: rotate(364deg);
transform: rotate(364deg);
}
}
@keyframes rotate_right {
from {
-webkit-transform: rotate(4deg);
transform: rotate(4deg);
}
to {
-webkit-transform: rotate(364deg);
transform: rotate(364deg);
}
}
五:解决Pjax之后一些js失效的问题
问题比如:Pjax之后Ajax评论不能提交,图片灯箱失效,代码高亮失效等等。
问题原因:原先容器绑定的事件被新容器替换掉了,新容器的div没有绑定事件,所以点击无效。
解决方法:利用Pjax的加载完成回调函数,重新绑定事件。
例如解决Pretty代码高亮只需要添加prettyPrint()
到pjax:complete
函数处即可。 处理Ajax评论需要添加Ajax评论相关的函数到pjax:complete
函数处。
(前提是要先加载好相关js&&css,部分主题需要修改相关的php来达到目的)
这一步是最繁琐的,完成后就可以享受Pjax带来的快感了。
文章评论
一直想用,但是不敢用
这是高手!
建网站还是有点难度