現在很多**( 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
function
handleclick(event, container, options) , defaults, options))
09
...
10
event.preventdefault()
11
}
12
var
pjax = $.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客戶端工具和命...