Pjax是什麼以及為什麼推薦大家用

2022-02-11 09:08:46 字數 3671 閱讀 1086

現在很多**( facebook,  twitter)

都支援這樣的一種瀏覽方式, 當你點選乙個站內的鏈結的時候, 不是做頁面跳轉, 而是只是站內頁面重新整理。 這樣的使用者體驗,

比起整個頁面都閃一下來說, 好很多。 其中有乙個很重要的組成部分, 這些**的ajax重新整理是支援瀏覽器歷史的, 重新整理頁面的同時,

我發現pjax提供了乙個指令碼支援這樣的功能。 pjax專案位址在   。 實際的效果見:  沒有勾選pjax的時候, 點選鏈結是跳轉的。 勾選了之後, 鏈結都是變成了ajax重新整理。

pjax有好幾個好處:

壞處我覺得也有:

綜合起來, 由於使用者體驗和資源利用率的提公升, 壞處是可以完全得到彌補的。我強烈推薦大家使用。

直接看 

官方文件 就可以了。 我覺得做技術的人要養成看一手的技術資料的習慣。 有乙個rails針對pjax的 

gem外掛程式 可以直接使用。 也有 

django的支援 。

為了能夠處理問題, 我們需要能夠理解pjax的運作方式。 pjax的**只有乙個檔案: /blob/master/jquery.pjax.js 如果有能力, 可以自己去看一遍。 我這裡解釋一下原理。 首先, 我們在html裡面指定, 需要做pjax的鏈結內容是哪些, 以及點選之後需要更新的部分(放在data-pjax屬性裡面): 

1

$('a[data-pjax]').pjax()

當載入了pjax指令碼之後, 它會攔截這些鏈結的事件, 然後包裝成乙個ajax請求, 傳送給伺服器。 

01

$.fn.pjax =function( container, options ) )

05

}

06

07

functionhandleclick(event, container, options) , defaults, options))

09

...

10

event.preventdefault()

11

}

12

varpjax = $.pjax =function( options )

這個請求帶有x-pjax的header標識, 伺服器在收到這樣的請求的時候, 就知道只需要渲染部分頁面返回就可以了。 

1

xhr.setrequestheader('x-pjax','true')

2

xhr.setrequestheader('x-pjax-container', context.selector)

pjax接受到返回的請求之後, 更新data-pjax指定的區域, 同時也會更新瀏覽器的位址。

1

options.success =function(data, status, xhr)

為了能夠支援瀏覽器的後退, 利用到了history的api, 記錄下來對應的資訊, 

01

pjax.state =

08

09

if(options.push || options.replace)

當瀏覽器後退的時候, 攔截事件, 根據記錄的歷史資訊, 產生乙個新的ajax請求。 

01

$(window).bind('popstate',function(event)

16

17

if(contents)else

33

...

34

}

35

}

36

}

為了支援fallback, 乙個是在載入的時候判斷瀏覽器是否支援history push state api:

1

// is pjax supported by this browser?

2

$.support.pjax =

3

window.history && window.history.pushstate && window.history.replacestate

4

// pushstate isn't reliable on ios until 5.

5

另乙個是當發現請求一段時間沒有回覆的時候(可以設定引數timeout), 直接做頁面跳轉。

1

options.beforesend =function(xhr, settings) , settings.timeout)

7

8

// clear timeout setting so jquerys internal timeout isn't invoked

9

settings.timeout = 0

既然都看到這裡了, 你為什麼不去實際使用一下pjax呢? 有那麼多好處, 我覺得幾乎所有**都應該採用pjax。 趕緊用起來吧!

session是什麼?為什麼出現?

當訪問伺服器某個網頁的時候,會在伺服器端的記憶體裡開闢一塊記憶體,這塊記憶體就叫做session,而這個記憶體是跟瀏覽器關聯在一起的。這個瀏覽器指的是瀏覽器視窗,或者是瀏覽器的子視窗,意思就是,只允許當前這個session對應的瀏覽器訪問,就算是在同乙個機器上新啟的瀏覽器也是無法訪問的。而另外乙個瀏...

MyCat是什麼?為什麼要用MyCat?

實習的時候,在乙個專案當中,專案經理要求把原先的mysql資料連線基於mycat來進行改造 當時就在想mycat是什麼東西?為什麼要用它呢?一 什麼是mycat mycat是乙個開源的分布式資料庫系統,是乙個實現了mysql協議的伺服器,前端使用者可以把它看作是乙個資料庫 用mysql客戶端工具和命...

MyCat是什麼?為什麼要用MyCat?

實習的時候,在乙個專案當中,專案經理要求把原先的mysql資料連線基於mycat來進行改造 當時就在想mycat是什麼東西?為什麼要用它呢?一 什麼是mycat mycat是乙個開源的分布式資料庫系統,是乙個實現了mysql協議的伺服器,前端使用者可以把它看作是乙個資料庫 用mysql客戶端工具和命...