操縱歷史,利用HTML5 History API實現無重新整理跳轉
寫在前面
有一次在上點點網的時候,發現登陸、註冊動畫效果非常華麗,但讓我感到震驚的是頁面竟能夠實現無重新整理跳轉(已改版,觀看此效果可以猛擊此處:GitHub或閱FM),回顧了所學的前端知識,似乎沒有任何技術可以實現這一點,於是百度搜羅了一下,才發現這原來是使用HTML5中History API實現的效果,但奈何一直未曾派上用場。直到我的部落格改版時,才將這一技術應用起來。
HTML4中的History API
history這個東西大家應該都不陌生,我們經常使用history.back(-1)來實現後退功能,具體的屬性和方法如下:屬性
- length 歷史的項數。JavaScript 所能管到的歷史被限制在用瀏覽器的“前進”“後退”鍵可以去到的範圍。本屬性返回的是“前進”和“後退”兩個按鍵之下包含的地址數的和。
方法
- back() 後退,跟按下“後退”鍵是等效的。
- forward() 前進,跟按下“前進”鍵是等效的。
- go() 用法:history.go(x);在歷史的範圍內去到指定的一個地址。如果 x < 0,則後退 x 個地址,如果 x > 0,則前進 x 個地址,如果 x == 0,則重新整理現在開啟的網頁。history.go(0) 跟 location.reload() 是等效的。
HTML5中的History API
- history.pushState(data, title [, url]):往歷史記錄堆疊頂部新增一條記錄;data會在onpopstate事件觸發時作為引數傳遞過去;title為頁面標題,當前所有瀏覽器都會忽略此引數;url為頁面地址,可選,預設為當前頁地址。
- history.replaceState(data, title [, url]) :更改當前的歷史記錄,引數同上。
- history.state:用於儲存以上方法的data資料,不同瀏覽器的讀寫許可權不一樣。
瀏覽器相容性
API | Chrome | Firefox(Geko) | Internet Explorer | Opera | Safari |
pushState, replaceState | 5 | 4.0(2.0) | -- | 11.50 | 5.0 |
history.state | -- | 4.0(2.0) | -- | 11.50 | -- |
- function supports_history_api(){
- return !!(window.history && history.pushState);
- }
為什麼要使用History API
在AJAX給我們帶來提高使用者體驗、減少HTTP連線數等好處的同時,也漸漸顯露出一些不足之處,比如:- 無法使用瀏覽器的前進、後退來切換前後資料。
- 當我們將瀏覽器位址列中的連結與朋友分享時,可能實際上卻並非我們期望的內容。
- 單純地使用AJAX不利於搜尋引擎優化。
實現無重新整理跳轉
上面都是一些理論知識(部分整理於網上),那麼無重新整理跳轉要怎麼實現呢?很簡單的一句程式碼:- history.pushState(null, '', 'newpage.html');
如果你使用的是HTML5瀏覽器,並點選了上面的按鈕,那麼應該可以看到,位址列的地址發生了改變,頁面卻沒有重新整理或跳轉。
這是一個最簡單的Demo,雖然實現了地址的無重新整理跳轉,但內容卻沒有對應改變,我們只要在pushState的同時配合上AJAX,一個無重新整理的頁面跳轉效果便完成了,AJAX的實現與本文主題無關,這裡就不再贅述,下面給出的Demo下載會有AJAX部分的程式碼。
相容瀏覽器前進後退效果
簡單地利用history.pushState,雖然可以實現無重新整理地址跳轉,但並沒有解決在瀏覽器中前進後退,內容並沒有相應改變這個問題,此時就需要用到window.onpopstate事件了,當頁面地址發生改變時,便會觸發window物件的onpopstate事件,而我們只要在pushState的同時將當前頁面的引數傳遞給瀏覽器,並在onpopstate事件中作出相應便可以了:- history.pushState({title: '頁面標題', html: '頁面HTML'}, '', 'newpage.html');
- window.onpopstate = function(event){
- if(event && event.state){
- document.title = event.state.title;
- document.body.innerHTML = event.state.html;
- }
- }
還有考慮當連結中含有井號“#”時應如何處理等等……
無重新整理跳轉的具體實現
熬夜將博文寫出,順便將Demo寫成了一個jQuery外掛,精神比較差,基本的功能已經實現,一些細節就暫不考慮了,如果有什麼問題歡迎大家提出。
話說這次的博文也寫的比較語無倫次,還請大家見諒。。
下載地址:http://vdisk.weibo.com/s/bVLeJ
注:由於History API存在安全方面的限制,請在服務端執行方能看到效果
還有話說
如果您願意支援一下的話,歡迎戳一戳我的部落格→http://www.clanfei.com←
由於前段時間部落格大規模改版,再加上購置了一級域名,現階段訪問量比較慘淡ToT。。如蒙關照,不勝感激。。
=======================籤 名 檔=======================
原文地址(我的部落格):http://www.clanfei.com/2012/09/1646.html
歡迎訪問交流,至於我為什麼要多弄一個部落格,因為我熱愛前端,熱愛網頁,我更希望有一個更加自由、真正屬於我自己的小站,或許並不是那麼有名氣,但至少能夠讓我為了它而加倍努力。。
=======================籤 名 檔=======================
相關文章
- HTML5 History API實現無重新整理跳轉HTMLAPI
- 操縱瀏覽器歷史記錄 : popstate() 、 history.pushState() 、 window.history.pushState()瀏覽器
- HTML5歷史狀態管理history API-pushState/replaceState與popstate事件HTMLAPI事件
- HTML5 history API實踐HTMLAPI
- Html5無重新整理修改Url,history pushState/replaceStateHTML
- HTML5 : History APIHTMLAPI
- 「前端」History API與瀏覽器歷史堆疊管理前端API瀏覽器
- Html5 History API解析HTMLAPI
- History(歷史)命令用法 15 例
- Html5使用history物件history.pushState()和history.replaceState()方法新增和修改瀏覽歷史記錄HTML物件
- 使用HTML5的History APIHTMLAPI
- Flutter中實現無Context跳轉FlutterContext
- window history pushState replaceState 跳轉原理
- 拉丁字母的歷史(History of the Latin alphabet)Alphabet
- Laravel + vue-router 實現 HTML5 History 模式LaravelVueHTML模式
- 利用HTML5,無JS實現各種互動效果HTMLJS
- JDBC:java提供的專門操縱資料庫的APIJDBCJava資料庫API
- 人工智慧的歷史(History of artificial intelligence)人工智慧Intel
- C++的歷史紀實 (轉)C++
- 影片操縱中的新AI技術轉向AI
- 分析:操縱的藝術
- 我發現我的資料被操縱了……
- 無重新整理上傳檔案以及HTML5下的實現方式HTML
- 單頁應用巧用history.go()、history.length返回到歷史指定頁面Go
- 天涯跳轉操作cpa專案實操賺錢教程案例
- 視訊操縱中的新AI技術轉向AI
- JavaScript視窗功能指南之操縱視窗 (轉)JavaScript
- 利用API函式實現影像淡入淡出效果 (轉)API函式
- 4個快速查詢Linux歷史命令的技巧(history)Linux
- 深入學習History物件管理瀏覽器會話歷史物件瀏覽器會話
- 第89天:HTML5中訪問歷史、全屏和網頁儲存APIHTML網頁API
- Nginx 實現 Rewrite 跳轉Nginx
- HTML5歷史管理狀態機制HTML
- 利用oracle 傳輸表空間來實現歷史資料分離的方案Oracle
- 使用Ajax和history.pushState()實現無重新整理改變頁面內容和位址列Url
- PHP頁面跳轉如何實現延時跳轉PHP
- HTML5中History.back()頁面後退重新整理頁面HTML
- html5實現全屏的api方法HTMLAPI