摘要:首發前端路由實現了解新增了兩個和兩個都接收三個參數狀態對象一個對象,與用方法創建的新歷史記錄條目關聯??紤]到未來可能會對該方法進行修改,傳一個空字符串會比較安全。該參數是可選的不指定的話則為文檔當前。
首發:前端路由實現(history)
了解HTML5 history新增了兩個API:history.pushState和history.replaceState
兩個API都接收三個參數:
狀態對象(state object):一個JavaScript對象,與用pushState()方法創建的新歷史記錄條目關聯。無論何時用戶導航到新創建的狀態,popstate事件都會被觸發,并且事件對象的state屬性都包含歷史記錄條目的狀態對象的拷貝。
標題(title):FireFox瀏覽器目前會忽略該參數,雖然以后可能會用上??紤]到未來可能會對該方法進行修改,傳一個空字符串會比較安全?;蛘撸阋部梢詡魅胍粋€簡短的標題,標明將要進入的狀態。
地址(URL): 新的歷史記錄條目的地址。瀏覽器不會在調用pushState()方法后加載該地址,但之后,可能會試圖加載,例如用戶重啟瀏覽器。新的URL不一定是絕對路徑;如果是相對路徑,它將以當前URL為基準;傳入的URL與當前URL應該是同源的,否則,pushState()會拋出異常。該參數是可選的;不指定的話則為文檔當前URL。
相同之處是兩個 API 都會操作瀏覽器的歷史記錄,而不會引起頁面的刷新。
不同之處在于pushState會增加一條新的歷史記錄,而replaceState則會替換當前的歷史記錄。
這里大家可以先F12試試,看看地址欄發生了什么變化
window.history.pushState(null, null, "hell"); window.history.pushState(null, null, "/hell"); window.history.pushState(null, null, "#/hello"); window.history.pushState(null, null, "?name=");
注意:這里的url不支持跨域,否則會拋出異常嘗試
index.html
前端路由實現
router.js
;(function(){ history.replaceState(null,null,"");//最開始的狀態,采用replace直接替換 $("#router").html("nav1
") $("a").on("click",function(){ console.log(this.text) var text = this.text; $("#router").html(""+ text +"
") history.pushState(null,null,"#/"+text); }) })()
最簡單的示例,只能監聽點擊事件,而瀏覽器中的后、前進都不能監聽地址欄的改變
router.js
狀態版 ;(function(){ var count = [0,0,0] $("#router").html("導航1:
"+count[0]+"導航2:
"+count[1]+"導航3:
"+count[2]) history.replaceState(count,null,"");//最開始的狀態,采用replace直接替換 for(var i = 0 ; i<$("a").length; i++){ $("a")[i].index = i $("a").eq(i).on("click",function(){ console.log(this.index); var index = this.index; count[index]++; $("#router").html("導航1:
"+count[0]+"導航2:
"+count[1]+"導航3:
"+count[2]) history.pushState(count,null,"#/count"+count[index]);//之后的狀態,需要進行保存 }) } //監聽history其他api導致地址欄url改變事件 window.addEventListener("popstate",function(e){ console.log(e.state); var state = e.state; $("#router").html("導航1:
"+state[0]+"導航2:
"+state[1]+"導航3:
"+state[2]) }) })()
popstate
當活動歷史記錄條目更改時,將觸發popstate事件。如果被激活的歷史記錄條目是通過對history.pushState()的調用創建的,或者受到對history.replaceState()的調用的影響,popstate事件的state屬性包含歷史條目的狀態對象的副本。需要注意的是調用history.pushState()或history.replaceState()不會觸發popstate事件。只有在做出瀏覽器動作時,才會觸發該事件,如用戶點擊瀏覽器的回退按鈕(或者在Javascript代碼中調用history.back())
router.js
;(function(){ var url = "nav1"; history.replaceState(url,null,"");//最開始的狀態,采用replace直接替換 $("#router").html(""+url+"
") $("a").on("click",function(){ console.log(this.text) url = this.text; $("#router").html(""+ url +"
") history.pushState(url,null,"#/"+url); }) window.addEventListener("popstate",function(e){ console.log(e.state); url = e.state $("#router").html(""+ url +"
") }); })()
兜兜轉轉我們算是回到了起點,但是通過這張圖我們會發現頁面點擊刷新按鈕會有導航和內容塊不一致的內容,所以我們需要改進他,并且監聽load事件
改進
;(function(){ $("a").on("click",function(){ console.log(this.text) url = this.text; $("#router").html(""+ url +"
") history.pushState(url,null,"#/"+url); }) window.addEventListener("popstate",function(e){ console.log(e.state); url = e.state $("#router").html(""+ url +"
") }); window.addEventListener("load",function(){ url = location.hash.slice(2) || "nav1"; history.replaceState(url,null,""); console.log(location.hash); $("#router").html(""+ url +"
"); }); })()
可以看到我們點擊刷新的時候導航和內容區域一致了。
我們這里還是采用了ajax的load方法
router.js
;(function(){ var router = [ { "path":"index", "url":"./main.html" }, { "path":"news", "url":"./news.html" }, { "path":"about", "url":"./about.html" } ]; //改變頁面 function display_page(url){ $("#router").load(url) } $("a").on("click",function(){ var path = $(this).data("path"); console.log(path) for(var i in router){ if(router[i].path == path){ display_page(router[i].url); history.pushState(router[i].url,null,router[i].path); } } }) window.addEventListener("popstate",function(e){ var url = e.state; display_page(url); }); window.addEventListener("load",function(){ var start = location.href.lastIndexOf("/"); var path = location.hash.slice(start) || "index"; console.log(path) for(var i in router){//刷新 加載 console.log(1) if(router[i].path == path){ display_page(router[i].url); history.replaceState(router[i].url,null,path); break; } if(i == router.length-1){//重定向 display_page(router[0].url); history.replaceState(router[i].url,null,router[0].path); } } }); })()
可以看到基本是實現了history路由功能,但是這里有一個問題就是刷新后因為地址欄url原因會報錯,也就是找不到這個頁面,這是由于刷新的時候是重載,重新向網站目錄查找文件,而我們當前目錄并沒有這個文件資源所以導致報錯。需要后臺攔截! 放棄!
折中
最后我還是屈服于#了
;(function(){ var router = [ { "path":"index", "url":"./main.html" }, { "path":"news", "url":"./news.html" }, { "path":"about", "url":"./about.html" } ]; //改變頁面 function display_page(url){ $("#router").load(url) } $("a").on("click",function(){ var path = $(this).data("path"); console.log(path) for(var i in router){ if(router[i].path == path){ display_page(router[i].url); history.pushState(router[i].url,null,"#/"+router[i].path); } } }) window.addEventListener("popstate",function(e){ var url = e.state; display_page(url); }); window.addEventListener("load",function(){ var path = location.hash.slice(2) || "/index"; console.log(path) for(var i in router){//刷新 加載 console.log(1) if(router[i].path == path){ display_page(router[i].url); history.replaceState(router[i].url,null,"#/" + path); break; } if(i == router.length-1){//重定向 display_page(router[0].url); history.replaceState(router[0].url,null,"#/" + router[0].path); } } }); })();
勉強的很呀
代碼: router(history)
演示: 演示地址
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/95584.html
摘要:而應用便是基于前端路由實現的所以便有了前端路由。因為兩種模式都需要調用一個方法來實現不同路由內容的刷新前端路由路由列表匹配當前的路由匹配不到則使用配置內容并渲染下面我們來實現兩種模式。 什么是路由? 路由這概念最開始是在后端出現的,在以前前后端不分離的時候,由后端來控制路由,服務器接收客戶端的請求,解析對應的url路徑,并返回對應的頁面/資源。 簡單的說 路由就是根據不同的url地...
摘要:如何實現前端路由要實現前端路由,需要解決兩個核心如何改變卻不引起頁面刷新如何檢測變化了下面分別使用和兩種實現方式回答上面的兩個核心問題。 原文鏈接:github.com/whinc/blog/… 在單頁應用如此流行的今天,曾經令人驚嘆的前端路由已經成為各大框架的基礎標配,每個框架都提供了強大的路由功能,導致路由實現變的復雜。想要搞懂路由內部實現還是有些困難的,但是如果只想了解路由實現基本...
摘要:回調函數將在更新時觸發,回調中的起到了新的的作用。注冊回調在中使用注冊的回調函數,最終放在模塊的回調函數數組中。 原文地址:https://github.com/joeyguo/blog/issues/2 在單頁應用上,前端路由并不陌生。很多前端框架也會有獨立開發或推薦配套使用的路由系統。那么,當我們在談前端路由的時候,還可以談些什么?本文將簡要分析并實現一個的前端路由,并對 reac...
摘要:單頁面應用利用了動態變換網頁內容避免了頁面重載路由則提供了瀏覽器地址變化網頁內容也跟隨變化兩者結合起來則為我們提供了體驗良好的單頁面應用前端路由實現方式路由需要實現三個功能瀏覽器地址變化切換頁面點擊瀏覽器后退前進按鈕,網頁內容跟隨變化刷新瀏 單頁面應用利用了JavaScript動態變換網頁內容,避免了頁面重載;路由則提供了瀏覽器地址變化,網頁內容也跟隨變化,兩者結合起來則為我們提供了體...
摘要:開發中路由實現原理開發中路由實現原理服務端路由路由前端路由實現比較參考什么是路由根據不同的地址,展示不同的頁面或者更新頁面局部視圖服務端路由服務器端路由管理,常見的開發模式是前端根據的不同,使用發起異步請求,獲取不同的頁面資源,前端獲取資源 Web開發中路由實現原理 Web開發中路由實現原理 服務端路由 Hash路由 History 前端路由實現比較 參考: 什么是路由: 根據不同...
閱讀 2885·2021-10-14 09:50
閱讀 1230·2021-10-08 10:21
閱讀 3663·2021-10-08 10:16
閱讀 3070·2021-09-27 14:02
閱讀 3146·2021-09-23 11:21
閱讀 2134·2021-09-07 10:17
閱讀 416·2019-08-30 14:00
閱讀 2121·2019-08-29 17:26