有一个名为 pjax 的 jQuery 插件,它声称:"它拥有真正的永久链接、页面标题和可用的后退按钮,完全降级。"
该插件使用 HTML5 pushState 和 AJAX 来动态更改页面,而无需完全加载。如果不支持 pushState,则 PJAX 执行完整页面加载,确保向后兼容性。
pjax 监听指定的页面元素,例如<a>
。然后,当调用<a href=""></a>
元素时,将使用X-PJAX
标头或指定的片段获取目标页面。
示例:
<script type="text/javascript">
$(document).pjax('a', '#pjax-container');
</script>
将这段代码放在页面头部将监听文档中的所有链接,并设置要从新页面获取并替换在当前页面上的元素。(意味着您想用远程页面上的
#pjax-container
替换当前页面上的
#pjax-container
)
当调用
<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>
如果响应中第一个找到的元素不是#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 选项,似乎会获取所请求元素的子元素。
iframe
标签,后面跟着一个闭合的div
标签。 - Musa