整合全站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带来的快感了。

赞(1) 打赏
转载请保留出处:耗子博客 » 整合全站PJAX无刷新简易教程
分享到: 更多 (0)

评论 2

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #0

    这是高手!

    笔名1年前 (2019-07-20)回复
  2. #0

    建网站还是有点难度

    鳄鱼皮具1年前 (2019-07-18)回复

金额随意,一百两百也不介意的啦

支付宝扫一扫打赏

微信扫一扫打赏

Loading