摘要:這里借鑒了一下的處理方式,我們把多帶帶模塊的包裝成一個函數,提供一個全局的回調方法,加載完成時候再調用回調函數。
前端路由實現之 #hash
先上github項目地址: spa-routers
運行效果圖
用了許多前端框架來做spa應用,比如說backbone,angular,vue他們都有各自的路由系統,管理著前端的每一個頁面切換,想要理解其中路由的實現,最好的方法就是手動實現一個。
前端路由有2種實現方式,一種是html5推出的historyapi,我們這里說的是另一種hash路由,就是常見的 # 號,這種方式兼容性更好。
我們這里只是簡單的實現一個路由輪子,基本的功能包含以下:
切換頁面
異步加載js
異步傳參
實現步驟
切換頁面:路由的最大作用就是切換頁面,以往后臺的路由是直接改變了頁面的url方式促使頁面刷新。但是前端路由通過 # 號不能刷新頁面,只能通過 window 的監聽事件 hashchange 來監聽hash的變化,然后捕獲到具體的hash值進行操作
//路由切換 window.addEventListener("hashchange",function(){ //do something this.hashChange() })
注冊路由:我們需要把路由規則注冊到頁面,這樣頁面在切換的時候才會有不同的效果。
//注冊函數 map:function(path,callback){ path = path.replace(/s*/g,"");//過濾空格 //在有回調,且回調是一個正確的函數的情況下進行存儲 以 /name 為key的對象 {callback:xx} if(callback && Object.prototype.toString.call(callback) === "[object Function]" ){ this.routers[path] ={ callback:callback,//回調 fn:null //存儲異步文件狀態,用來記錄異步的js文件是否下載,下文有提及 } }else{ //打印出錯的堆棧信息 console.trace("注冊"+path+"地址需要提供正確的的注冊回調") } } //調用方式 map("/detail",function(transition){ ... })
異步加載js:一般單頁面應用為了性能優化,都會把各個頁面的文件拆分開,按需加載,所以路由里面要加入異步加載js文件的功能。異步加載我們就采用最簡單的原生方法,創建script標簽,動態引入js。
var _body= document.getElementsByTagName("body")[0], scriptEle= document.createElement("script"); scriptEle.type= "text/javascript"; scriptEle.src= xxx.js; scriptEle.async = true; scriptEle.onload= function(callback){ //為了避免重復引入js,我們需要在這里記錄一下已經加載過的文件,對應的 fn需要賦值處理 callback() } _body.appendChild(scriptEle);
參數傳遞:在我們動態引入多帶帶模塊的js之后,我們可能需要給這個模塊傳遞一些多帶帶的參數。這里借鑒了一下jsonp的處理方式,我們把多帶帶模塊的js包裝成一個函數,提供一個全局的回調方法,加載完成時候再調用回調函數。
SPA_RESOLVE_INIT = function(transition) { document.getElementById("content").innerHTML = "當前異步渲染列表頁"+ JSON.stringify(transition) +"
" console.log("首頁回調" + JSON.stringify(transition)) }
擴展:以上我們已經完成了基本功能,我們再對齊進行擴展,在頁面切換之前beforeEach和切換完成afterEach的時候增加2個方法進行處理。思路是,注冊了這2個方法之后,在切換之前就調用beforeEach,切換之后,需要等待下載js完成,在onload里面進行調用 afterEach
//切換之前一些處理 beforeEach:function(callback){ if(Object.prototype.toString.call(callback) === "[object Function]"){ this.beforeFun = callback; }else{ console.trace("路由切換前鉤子函數不正確") } }, //切換成功之后 afterEach:function(callback){ if(Object.prototype.toString.call(callback) === "[object Function]"){ this.afterFun = callback; }else{ console.trace("路由切換后回調函數不正確") } },
通過以上的思路分析,再加以整合,我們就完成了一個簡單的前端路由,并且可以加到頁面進行實際的SPA開發,不過還是非常簡陋。
完整代碼/* *author:https://github.com/kliuj **使用方法 * 1:注冊路由 : spaRouters.map("/name",function(transition){ //異步加載js spaRouters.asyncFun("name.js",transition) //或者同步執行回調 spaRouters.syncFun(function(transition){},transition) }) 2:初始化 spaRouters.init() 3:跳轉 href = "#/name" */ (function() { var util = { //獲取路由的路徑和詳細參數 getParamsUrl:function(){ var hashDeatail = location.hash.split("?"), hashName = hashDeatail[0].split("#")[1],//路由地址 params = hashDeatail[1] ? hashDeatail[1].split("&") : [],//參數內容 query = {}; for(var i = 0;i簡單的單頁面在github上有完整的demo
spa-routers以上僅是我個人的一些看法,如有疑問,感謝指導
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/80805.html
摘要:原作者原鏈接基于多入口生成模板用于服務端渲染的方案及實戰法律聲明警告本作品遵循署名非商業性使用禁止演繹未本地化版本協議發布。這是什么背景現代化的前端項目中很多都使用了客戶端渲染的單頁面應用。 原作者:@LinuxerPHL原鏈接:基于 Webpack 4 多入口生成模板用于服務端渲染的方案及實戰 法律聲明 警告:本作品遵循 署名-非商業性使用-禁止演繹3.0 未本地化版本(CC BY-...
摘要:原作者原博文地址基于多入口生成模板用于服務端渲染的方案及實戰法律聲明警告本作品遵循署名非商業性使用禁止演繹未本地化版本協議發布。這是什么背景現代化的前端項目中很多都使用了客戶端渲染的單頁面應用。 原作者:@LinuxerPHL原博文地址: 基于 Webpack 4 多入口生成模板用于服務端渲染的方案及實戰 法律聲明 警告:本作品遵循 署名-非商業性使用-禁止演繹3.0 未本地化版本(...
摘要:后續我們還會增加一些實戰類的移動開發案例,歡迎關注專欄。進入官網新版預覽在線預覽需要使用開啟設備模擬,效果更佳。 前言 之前寫過一篇 2018開發最快的Webapp框架--BUI交互框架 ,如果你還沒看過,可以簡單看一下,主要介紹了BUI的基本功能,有多少控件,以及實現的思路,BUI 1.5版本以后變化很大,統一新的風格,新的規范750,新增基于Dom的數據驅動,完善了頁面的生命周期等...
摘要:單頁面應用的出現依然存在著爭議性,我們該如何看待他的兩面性呢接下來小生給大家總結一下他的優缺點。單頁面應用的優勢無刷新體驗沒有了令人詬病的頁面頻繁刷新,同時節約瀏覽器資源,路由響應比較及時,提升了用戶的體驗。 前端猿一天不學習就沒飯吃了,后端猿三天不學習仍舊有白米飯擺于桌前。IT行業的快速發展一直在推動著前端技術棧在不斷地更新換代,前端的發展成了互聯網時代的一個縮影。而單頁面應用的發展...
閱讀 2750·2021-10-26 09:50
閱讀 2391·2021-10-11 11:08
閱讀 2132·2019-08-30 15:53
閱讀 1911·2019-08-30 15:44
閱讀 2386·2019-08-28 18:12
閱讀 2525·2019-08-26 13:59
閱讀 2858·2019-08-26 12:19
閱讀 2758·2019-08-26 12:09