有一个 jQuery 插件叫做pjax https://github.com/defunkt/jquery-pjax它指出:“它是具有真正的永久链接、页面标题和完全降级的工作后退按钮的 ajax。”
该插件使用 HTML5 PushState 和 AJAX 动态更改页面而无需完全加载。如果不支持pushState,PJAX 会执行整页加载,以确保向后兼容性。
pjax 的作用是监听指定的页面元素,例如<a>
。然后当<a href=""></a>
调用元素时,可以使用以下任一方式获取目标页面X-PJAX
标头或指定的片段。
Example:
<script type="text/javascript">
$(document).pjax('a', '#pjax-container');
</script>
将此代码放入页面标题中将侦听文档中的所有链接,并设置从新页面获取并在当前页面上替换的元素。
(意味着你想替换#pjax-container
在当前页面上#pjax-container
从远程页面)
When <a>
被调用时,它将获取带有请求标头的链接X-PJAX
并将查找以下内容#pjax-container
在结果中。如果结果是#pjax-container
,当前页面上的容器将被新结果替换。
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="jquery.pjax.js"></script>
<script type="text/javascript">
$(document).pjax('a', '#pjax-container');
</script>
</head>
<body>
<h1>My Site</h1>
<div class="container" id="pjax-container">
Go to <a href="/page2">next page</a>.
</div>
</body>
</html>
If #pjax-container
不是响应中找到的第一个元素,PJAX 将无法识别该内容并对请求的链接执行完整页面加载。要解决此问题,需要将服务器后端代码设置为仅发送#pjax-container
.
服务器端代码示例page2
:
//if header X-PJAX == true in request headers, send
<div class="container" id="pjax-container">
Go to <a href="/page1">next page</a>.
</div>
//else send full page
如果您无法更改服务器端代码,则片段选项是一种替代选择。
$(document).pjax('a', '#pjax-container', {
fragment: '#pjax-container'
});
注意fragment
是一个较旧的 pjax 选项,似乎会获取所请求元素的子元素。