pjax使用小结

简介

虽然传统的 ajax 方式可以异步无刷新改变页面内容,但无法改变页面 URL,因此有种方案是在内容发生改变后通过改变 URL 的 hash 的方式获得更好的可访问性,但是 hash 的方式有时候不能很好的处理浏览器的前进、后退,而且常规代码要切换到这种方式还要做不少额外的处理。而 pjax 的出现就是为了解决这些问题,简单的说就是对 ajax 的加强。

pjax 结合 pushState 和 ajax 技术, 不需要重新加载整个页面就能从服务器加载 Html 到你当前页面,这个 ajax 请求会有永久链接、title 并支持浏览器的回退/前进按钮。

pjax使用前

bug错误

在使用jquery.pjax的时候发现加载页面时不会执行其中的layui以及jquery的初始化方法,包括一些插件的初始化方法。

查看源码后发现该jquery.pjax替换容器内容时,是将服务器端返回的html转换为了jquery dom节点然后再执行的替换,但是这样操作会导致一系列的加载事件不会被触发,导致例如jquery和layui的初始化方法不会被执行。

于是决定将添加dom节点修改为直接添加html片段。

解决修改代码

.将jquery.pjax.js中311行的 context.html(container.contents)修改为 context.html(data)。

    这样在pjax加载新页面的时候便会直接将服务器端返回html片段添加进容器。

    但是这样仅处理了新增页面,而执行回退操作时pjax会从缓存中读取上一个页面的内容,同样pjax在回退上一个页面的时候依然是以dom节点的方式存储和添加的,所以我们还需要继续修改。

2.

    将365行的

cachePush(pjax.state.id,[options.container,cloneContents(context)])

    修改为

  cachePush(pjax.state.id, [options.container, context.html()])

到此修改完成,此时使用pjax加载新页面的时候,layui jquery等插件的初始化方法即可正确执行。

用法

  1. 引入 jquery 和 jquery.pjax.js
  2. 注册事件
/**
  * 方式一 按钮父节点监听事件
  *
  * @param selector  触发点击事件的按钮
  * @param container 展示刷新内容的容器,也就是会被替换的部分
  * @param options   参数
  */
$(document).pjax(selector, [container], options);

// 方式二 直接对按钮监听,可以不用指定容器,使用按钮的data-pjax属性值查找容器
$("a[data-pjax]").pjax();

// 方式三 常规的点击事件监听方式
$(document).on('click', 'a', $.pjax.click);
$(document).on('click', 'a', function(event) {
    var container = $(this).closest('[data-pjax-container]');
    $.pjax.click(event, container);
});

// 下列是源码中介绍的其他用法,由于本人暂时没有那些需求暂时没深究,有兴趣的各位自己试试看哈
// 表单提交
$(document).on('submit', 'form', function(event) {
    var container = $(this).closest('[data-pjax-container]');
    $.pjax.submit(event, container);
});
// 加载内容到指定容器
$.pjax({ url: this.href, container: '#main' });
// 重新当前页面容器的内容
$.pjax.reload('#container');

如何将Pjax整合进网站,实现全站无刷新加载?(以本站为例)

<!-- <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.5.1.min.js"></script> -->
<!-- <script src="/player/js/jquery.js"></script> -->
<script src="/player/js/jquery.cookie.js"></script>
<script src="/player/js/jquery.pjax.js"></script>

<script>

// 自定义
jQuery(window).load(function() {
  
	//n2-ss-3-placeholder
	jQuery(document).pjax('a[target!=_blank]', 'body', {fragment:'body', timeout:6000});
	jQuery(document).on('submit', 'form', function (event) {jQuery.pjax.submit(event, 'body', {fragment:'body', timeout:6000});});
	jQuery(document).on('pjax:send', function() {
		jQuery('body').fadeTo(700,0.0);
	});
	jQuery(document).on('pjax:complete', function() {
		var url=window.location.href;
		console.log(url);
		var val=url.indexOf("%e5%ad%a6%e4%b9%a0%e8%a1%8d%e7%94%9f%e5%93%81");
	   if(val!=-1){
		   val=url.slice(64);
			if(val!==""){
				
				jQuery("#primary").css("width","100%");
			}
	   }
		jQuery('body').fadeTo(700,1);
	});
	jQuery(document).on('click', '#wpnp_previous', $.pjax.click);
	jQuery(document).on('click', '#wpnp_next', $.pjax.click);
	
	
});
</script>
<script id="ilt" src="/player/js/player.js" ></script>
<style>
	.aaa{display:none;position:fixed !important; position:absolute; bottom:0px; right:0px;width:350px;height:600px }
	
</style>

衍生品:网站左边的音乐播放器,和右边的客服系统

客服系统测试后台

地址:http://kefu.zlhdsg.com/admin

用户名:admin

密码:admin

客服系统未加密版200一套,加密版50一套,带使用方法、数据库以及全部源码,有意私聊,hyperf初学者,以及大学和硕士php方面论文编写的同学有很大参考价值。。

0 评论
内联反馈
查看所有评论