ajax和html5無刷新改變頁面URL
表現
如果你使用chrome或firefox等瀏覽器訪問本部落格、github.com、plus.google.com等網站時,細心的你會發現頁面之間的點擊是透過ajax異步請求的,同時頁面的URL發生了改變。並且能夠很好的支援瀏覽器前進和後退。
是什麼有這麼強大的功能呢?
HTML5裡引用了新的API,history.pushState和history.replaceState,就是透過這個介面做到無刷新改變頁面URL的。
與傳統的AJAX的區別
傳統的ajax有如下的問題:
1、可以無刷新改變頁面內容,但無法改變頁面URL
2、為了更好的可訪問性,內容改變後,通常改變URL的hash
3、hash的方式不能很好的處理瀏覽器的前進、後退等問題
4、進而瀏覽器引入了onhashchange的接口,不支持的瀏覽器只能定時去判斷hash是否改變
5、但這種方式對搜尋引擎很不友善
6、twitter和google約定了使用#!xxx(即hash第一個字元為!),搜尋引擎支援。
為了解決傳統ajax帶來的問題,HTML5裡引入了新的API,即:history.pushState, history.replaceState
可以透過pushState和replaceState介面操作瀏覽器歷史,並且改變目前頁面的URL。
pushState是將指定的URL加入瀏覽器歷史裡,replaceState是將指定的URL取代目前的URL。
如何使用
var state = { title: title, url: options.url, otherkey: othervalue }; window.history.pushState(state, document.title, url);
state物件除了要title和url之外,你也可以加入其他的數據,例如:還想將一些發送ajax的配置給保存起來。
replaceState和pushState是相似的,這裡就不多介紹了。
如何回應瀏覽器的前進、後退操作
window物件上提供了onpopstate事件,上面傳遞的state物件會成為event的子對象,這樣就可以拿到儲存的title和URL了。
window.addEventListener('popstate', function(e){ if (history.state){ var state = e.state; //do something(state.url, state.title); } }, false);
這樣就可以結合ajax和pushState完美的進行無刷新瀏覽了。
一些限制
1、傳遞的URL必須是同域下的,無法跨域
2、state物件雖然可以儲存很多自訂的屬性,但對於不可序列化的物件則不能存儲,如:DOM對象。
對應後端的一些處理
這種模式下除了當前使用ajax可以無刷新瀏覽外,還要保證直接請求改變的URL後也可以正常瀏覽,所以後端要對這些處理下。
1、對使用pushState的ajax發送一個特殊的頭,如: setRequestHeader(‘PJAX’, ‘true’)。
2、後端取得到有PJAX=true的header時,將頁面中通用的部分都不輸出。例如:PHP可以透過下面的判斷
function is_pjax(){ return array_key_exists('HTTP_X_PJAX', $_SERVER) && $_SERVER['HTTP_X_PJAX'] === 'true'; }
雖然介面上只有pushState、replaceState、onpopstate,但使用的時候需要做很多的處理。
針對這個已經寫好了一個基於jquery的插件,已經將ajax+history.pushState封裝成pjax, 專案地址: https://github.com/welefen/pjax, 目前支援jquery, qwrap, kissy 3個版本
此外,如果想考慮到HTML4和HTML5下都能有次效果,可以參考history.js,專案地址為:https://github.com/browserstate/history.js。
參考資料:
1、Introducing the HTML5 History API
2、Manipulating the browser history
3、Session history and navigation
3、Session history and navigation

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)