Pjax是對Ajax + pushState的封裝忆畅,可以實現(xiàn)網(wǎng)頁的ajax加載填抬,改變網(wǎng)頁URL卻不會刷新網(wǎng)頁整體本身辈挂,避免重新加載網(wǎng)頁中大部分的控件和插件丁频。
pushState的功能具體來說就是修改url而頁面無跳轉(zhuǎn),并且該url會被存放在歷史記錄中燃少。
window.history.pushState(state, title, url);
GitHub傳送門:
https://github.com/defunkt/jquery-pjax/blob/master/jquery.pjax.js
pjax執(zhí)行流程:
-
1.觸發(fā)事件后執(zhí)行相關(guān)語句或者函數(shù)局蚀,包裝成為ajax向服務(wù)器請求數(shù)據(jù)掉缺;
options = $.extend(true, {}, $.ajaxSettings, pjax.defaults, options) pjax.options = optionsvar xhr = pjax.xhr = $.ajax(options)
-
2.給請求附加X-PJAX標識仔戈,服務(wù)器只會返回Container中的內(nèi)容:
xhr.setRequestHeader('X-PJAX', 'true') xhr.setRequestHeader('X-PJAX-Container', context.selector)
-
3.更新Container的內(nèi)容蹬癌;
function pjaxReload(container, options) { var defaults = { url: window.location.href, push: false, replace: true, scrollTo: false } return pjax($.extend(defaults, optionsFor(container, options)))}
-
4.pushState 方法把當前的頁面的地址亏吝、標題等信息放入瀏覽器歷史記錄中
if (xhr.readyState > 0) { if (options.push && !options.replace) { // Cache current container element before replacing it cachePush(pjax.state.id, cloneContents(context)) window.history.pushState(null, "", options.requestUrl) } fire('pjax:start', [xhr, options]) fire('pjax:send', [xhr, options]) } return pjax.xhr }
5.利用replaceState更新瀏覽器地址概疆;
function locationReplace(url)
{ window.history.replaceState(null, "", pjax.state.url)
window.location.replace(url)
}