路由切換:監聽hashchange事件實現


感謝這兩位大佬的分享:

原生js中的bind()

哈希路由實現&原理

暑期實習還是沒有着落...HR們是不是都覺得,這位同學就實習兩個月,東西學完了就跑了?

嗚嗚嗚不是啊我會好好工作的

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Router By Hash</title>
</head>
<body>
    <ul>
        <li><a href="#01">1</a></li>
        <li><a href="#02">2</a></li>
        <li><a href="#03">3</a></li>
        <li><a href="#04">4</a></li>
    </ul>
    <div>

    </div>
</body>
<script> window.onload = function(){ (//將路由函數包裹在IIFE內防止污染全局作用域
        function(){ var Router = function(){ this.routes = {}; this.curUrl = '/'; }; Router.prototype.init= function(){ // 對路由的hash值進行監聽,如果發生改變,則調用reloadPage()函數
            // 這里的兩個this 是不一樣的,需要注意
 window.addEventListener('hashchange',this.reloadPage.bind(this)); //bind()方法創建一個新的函數(稱為綁定函數), 當被調用時,將其this關鍵字設置為提供的值,
       //在這里,當觸發hashchange事件,會調用Router.prototype.reloadPage方法,如果直接this.reloadPage(),這個this會指向全局對象
        //因此這樣將其綁定
}; // 調用reloadPage函數,實際上時執行routes[]()函數 Router.prototype.reloadPage = function(){ //location.hash為#01,則this.curUrl為01,如果沒找到,就為'/' this.curUrl = location.hash.substring(1)||'/'; this.routes[this.curUrl]();//this.router[01]()方法,在原型對象的map方法中創建 }; // 路由配置的規則 Router.prototype.map = function(key,callback){ this.routes[key] = callback; //this.router[01] = callback } //將其暴露出去 window.Router = Router; })(); var ORouter = new Router(); //初始化,當路由改變,執行以當前實例為調用對象的reloadPage方法 ORouter.init(); // 以下為路由配置的設置,形象的當做一個路由與調用函數的映射表也可以 ORouter.map('/',function(){ var Osect = document.querySelector('div'); Osect.innerHTML = "0"; }); ORouter.map('01',function(){ var Osect = document.querySelector('div'); Osect.innerHTML = "1"; }); ORouter.map('02',function(){ var Osect = document.querySelector('div'); Osect.innerHTML = "2"; }); ORouter.map('03',function(){ var Osect = document.querySelector('div'); Osect.innerHTML = "3"; }); ORouter.map('04',function(){ var Osect = document.querySelector('div'); Osect.innerHTML = "4"; }); ORouter.map('05',function(){ var Osect = document.querySelector('div'); Osect.innerHTML = "5"; }); } </script> </html>

 

 


免責聲明!

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



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