1. 程式人生 > >前端hash路由基本原理,及代碼的基本實現

前端hash路由基本原理,及代碼的基本實現

alt ide class javascrip r.js border pop display 早期

路由就是指隨著瀏覽器地址欄的變化,展示給用戶的頁面也不相同。

早期的路由都是後端實現的,直接根據 url 來 reload 頁面,頁面變得越來越復雜服務器端壓力變大,隨著 ajax 的出現,頁面實現非 reload 就能刷新數據,也給前端路由的出現奠定了基礎。我們可以通過記錄 url 來記錄 ajax 的變化,從而實現前端路由。(可以根據不同的url來展示不同的頁面,很好的優化了頁面的交互體驗。)
目前有兩種方式:

1:H5的history的新API(pushstate、replacestate、popstate);由於不兼容IE10以下,本文不進行討論;可自行查看官網:https://developer.mozilla.org/en-US/docs/Web/API/History

2:hash路由基本實現原理:

  * 瀏覽器不會識別url中#後面的內容,所以改變#後面的內容不會觸發reload;

  * 通過hashchange我們可以監聽到#後面內容的改變,然後就可以進行ajax等操作。實現頁面的改變

下面代碼展示

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style type="text/css">
        /*css代碼比較混亂,大家不用在意這裏
*/ * { margin: 0; padding: 0; } .container { box-sizing: border-box; } .leftSide { display: flex; align-items: center; justify-content: center; width: 50%; height: 300px
; background-color: #bbb; } .rightSide { display: flex; align-items: center; justify-content: center; float: right; width: 50%; height: 300px; background-color: #5bb; } </style> </head> <body> <div class="container"> <div class="rightSide"> <div id="myPage"> </div> </div> <div class="leftSide"> <ul> <li><a href="#/">默認 </a></li> <li><a href="#/blue"></a></li> <li><a href="#/black"></a></li> </ul> </div> </div> </body> <script type="text/javascript" src="./myRouter.js"></script> </html>
(function() {
    class Router {
        constructor() {
            this.routes = {};
            this.currentUrl = "";
        }
        init() {
            window.addEventListener(‘load‘, () => this.refresh(), false);
            window.addEventListener(‘hashchange‘,() => this.refresh(), false);
        }
        refresh() {
            this.currentUrl = location.hash.slice(1) || "/";
            if (typeof this.routes[this.currentUrl] === ‘function‘) {
                this.routes[this.currentUrl]();
            }else {
                this.routes["/404"]();
            }
        }
        route(path, callback) {
            this.routes[path] = callback;
        }
    };

    function changeView(str) {
        document.getElementById("myPage").innerHTML=str;
    }

    var router=new Router();
    router.init();
    router.route("/", () => changeView("<h1>默認頁面</h1>"));
    router.route("/blue", () => changeView("<h1>blue頁面</h1>"));
    router.route("/black", () => changeView("<h1>black頁面</h1>"));
    router.route("/404",() => changeView("<h1>404    請求的頁面不存在</h1>"));
})()

以上就是hash路由的最簡單。最基本的實現;

最終的效果如下;通過點擊不同的按鈕,觸發url中hash部分的改變,改變頁面

技術分享圖片

前端hash路由基本原理,及代碼的基本實現