(一)HTML5 - pushState 無刷新更新地址


可以解決什么問題:

可以實現網頁的ajax加載,同時又能完成URL的改變而沒有網頁跳轉刷新的跡象,就像是改變了網頁的hash(#)一樣。

優於hash:

避免了改變hash的問題,避免了用戶不理解URL的形式感到疑惑,同時還有onpopstate提供監聽,良好響應后退前進。而且它不需要這個URL真實存在。

HTML5 的 pushState+Ajax

pushState() 的基本參數是:

1 var state = ( {
2 url: ~href, title: ~title, ~additionalKEY: ~additionalVALUE
3 } );
4 window.history.pushState(state, ~title, ~href);
5 window.history.replaceState( state, ~title, ~href);    // 替換

pushState、replaceState 的區別

pushState()可以創建歷史,可以配合popstate事件,而replaceState()則是替換掉當前的URL,不會產生歷史。

注:

只能用同域的URL替換,例如你不能用http://baidu.com去替換http://google.com。

state對象不存儲不可序列化的對象如DOM。

pushState 配合 popstate 監聽

1 window.addEventListener('popstate', function(evt){
2     var state = evt.state;
3     var tilte = state.tilte ;
4     var url = state.url
5     document.title=title;
6     doSomething(url);  // 自定義函數
7 }, false);

popstate與hashChange

對於http://www.abc.com/path?search=ghj#hashstring 這個url來說,

① http://為協議
② www.abc.com為host
③ path為path,也就是我們的子目錄,每個子目錄可以干很多事情
④ #hashstring為hash相關

①-③頁面會刷新,④頁面不刷新,

pushState與改變hash 相同點:可以改變url地址

pushState與改變hash 不同點:hashChange只能改變hashstring 部分,pushState可改變①-③而不刷新頁面

popstate 為1-3環節的變化引起的回調
hashChange 為hash變化引起的回調,是不同的

 

實例應用 - 劫持后退按鈕

(function(window, location) {
history.replaceState(null, document.title, location.pathname+"#!/stealingyourhistory");
history.pushState(null, document.title, location.pathname);
window.addEventListener("popstate", function() {
if(location.hash === "#!/stealingyourhistory") {
history.replaceState(null, document.title, location.pathname);
setTimeout(function(){
location.replace("http://www.baidu.com/");
},0); } }, false);  }(window, location));

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM