雖然傳統的ajax方式可以非同步無重新整理改變頁面內容,但無法改變頁面url,因此有種方案是在內容發生改變後通過改變url的hash的方式獲得更好的可訪問性(如但是hash的方式有時候不能很好的處理瀏覽器的前進、後退,而且常規**要切換到這種方式還要做不少額外的處理。而pjax的出現就是為了解決這些問題,簡單的說就是對ajax的加強。
不使用pjax
使用pjax
優點:缺點:引入jquery和jquery.pjax.js
註冊事件
/*引數名預設值* * 方式一 按鈕父節點監聽事件
* * @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) );
//下列是原始碼中介紹的其他用法,由於本人暫時沒有那些需求暫時沒深究,有興趣的各位自己試試看哈
//表單提交
$(document).on('submit', 'form', function
(event) );
//載入內容到指定容器
$.pjax();
//重新當前頁面容器的內容
$.pjax.reload('#container');
說明timeout
650ajax 超時時間(單位ms),超時後會執行預設的頁面跳轉,所以超時時間不應過短,不過一般不需要設定
push
true
使用window.history.pushstate改變位址列url(會新增新的歷史記錄)
replace
false
使用window.history.replacestate改變位址列url(不會新增歷史記錄)
maxcachelength
20快取的歷史頁面個數(pjax載入新頁面前會把原頁面的內容快取起來,快取載入後其中的指令碼會再次執行)
version
是乙個函式,返回當前頁面的pjax-version,即頁面中標籤內容。使用response.setheader("x-pjax-version", "")
設定與當前頁面不同的版本號,可強制頁面跳轉而不是區域性重新整理。
scrollto
0頁面載入後垂直滾動距離(與原頁面保持一致可使過度效果更平滑)
type
"get"
ajax的引數,http請求方式
datatype
"html"
ajax的引數,響應內容的content-type
container
用於查詢容器的css選擇器,[container]引數沒有指定時使用
urllink.href
要跳轉的連線,預設a標籤的href屬性
target
link
pjax事件引數e的relatedtarget屬性,預設為點選的a標籤
fragment
使用響應內容的指定部分(css選擇器)填充頁面,服務端不進行處理導致全頁面請求的時候需要使用該引數,簡單的說就是對請求到的頁面做擷取
pjax失效情況除了上述引數外,ajax的一些引數也是可以設定在這裡的,不過一般沒什麼必要。
// ajax 最終引數: options = $.extend(true, {}, $.ajaxsettings, pjax.defaults, options);
會有一些情況導致pjax失效,下面結合原始碼分析下(省略部分無關**)
function除了上述情況之外,還有下列幾種情況:handleclick(event, container, options)
}
1. 點選鏈結後觸發的一系列事件, 除了pjax:click 和 pjax:clicked的事件源是點選的按鈕,其他事件的事件源都是要替換內容的容器。可以在pjax:start事件觸發時開始過度動畫,在pjax:end事件觸發時結束過度動畫。
事件名支援取消
引數說明
pjax:click
✔
options
點選按鈕時觸發。可呼叫e.preventdefault();
取消pjax
pjax:beforesend
✔
xhr, options
ajax執行beforesend
函式時觸發,可在**函式中設定額外的請求頭引數。可呼叫e.preventdefault();
取消pjax
pjax:start
xhr, options
pjax開始(與伺服器連線建立後觸發)
pjax:send
xhr, options
pjax:start之後觸發
pjax:clicked
options
ajax請求開始後觸發
pjax:beforereplace
contents, options
ajax請求成功,內容替換渲染前觸發
pjax:success
data, status, xhr, options
內容替換成功後觸發
pjax:timeout
✔
xhr, options
ajax請求超時後觸發。可呼叫e.preventdefault();
繼續等待ajax請求結束
pjax:error
✔
xhr, textstatus, error, options
ajax請求失敗後觸發。預設失敗後會跳轉url,如要阻止跳轉可呼叫e.preventdefault();
pjax:complete
xhr, textstatus, options
ajax請求結束後觸發,不管成功還是失敗
pjax:end
xhr, options
pjax所有事件結束後觸發
注意:pjax:beforereplace事件前pjax會呼叫extractcontainer函式處理頁面內容,即script[src]形式引入的js指令碼不會被重複載入,有必要可以改下原始碼。
2. 瀏覽器前進/後退導航時觸發的事件(暫時沒做過多研究)
事件名引數
說明pjax:popstate
頁面導航方向: 'forward'/'back'(前進/後退)
pjax:start
null, options
pjax開始
pjax:beforereplace
contents, options
內容替換渲染前觸發,如果快取了要導航頁面的內容則使用快取,否則使用pjax載入
pjax:end
null, options
pjax結束
比較漂亮的一款進度條外掛程式,用法十分簡單,很適合做pjax的過度動畫,詳細用法在該專案github上有介紹
示例連線:
pjax技術簡述
pjax是乙個jquery外掛程式,結合ajax和pushstate,能夠快速的實現頁面重新整理和url修改。頁面a鏈結和表單提交都能觸發pjax請求,伺服器返回請求的html片段,區域性替換頁面內容同時把url推送到歷史記錄中,有效降低了負載。一 實現基礎 1.在html4,histroy物件有下...
全站利用pjax無重新整理展示
全站利用pjax無重新整理展示 終於抽出空寫這篇文章了,還是在上班事件摸魚寫的 不得不說,pjax很好用,很強,很好理解,並且幫助開發者省去了很大部分的工作量 但是由於整站替換後,有些事件還是得自己寫一下 簡單的記錄一下,自己實現全站pjax的一系列過程吧 雖然傳統的 ajax 方式可以非同步無重新...
AJAX之再公升級版PJAX
優點 按需請求,每次只需載入頁面的部分內容,而不用重複載入一些公共的資源檔案和不變的頁面結構,大大減小了資料請求量,以減輕對伺服器的頻寬和效能壓力,還大大提公升了頁面的載入速度。缺點 pjax使用了pushstate來改變位址列的url,這是html5中history的新特性,在某些舊版瀏覽器中可能...