整合全站PJAX无刷新简易教程
本教程仅适合有一定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带来的快感了。
第一次来,参观一下