前端hash路由基本原理,及代码的基本实现

路由就是指随着浏览器地址栏的变化,展示给用户的页面也不相同。

早期的路由都是后端实现的,直接根据 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部分的改变,改变页面

原文地址:https://www.cnblogs.com/zhilingege/p/8391338.html

时间: 2024-10-10 04:47:47

前端hash路由基本原理,及代码的基本实现的相关文章

对一致性Hash算法,Java代码实现的深入研究

一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法和一致性Hash算法的算法原理做了详细的解读. 算法的具体原理这里再次贴上: 先构造一个长度为232的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 232-1])将服务器节点放置在这个Hash环上,然后根据数据的Key值计算得到其Hash值(其分布也为[0, 232-1]),接着在

【转载】对一致性Hash算法,Java代码实现的深入研究

原文地址:http://www.cnblogs.com/xrq730/p/5186728.html 一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性Hash算法的算法原理做了详细的解读. 算法的具体原理这里再次贴上: 先构造一个长度为232的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 232-1])将服务器节点放置在这

React SPA 应用 hash 路由如何使用锚点

当我们在做 SPA 应用的时候,为了兼容老的浏览器(如IE9)我们不得不放弃 HTML5 browser history api 而只能采用 hash 路由的这种形式来实现前端路由,但是因为 hash 被路由占据了,导致本来不是问题的锚点功能却成了一个不大不小的问题. 经过我自己的搜索目前有两种方式能够解决这个问题,为了能在 react 生态下面简单优雅的使用,我专门封装了一个锚点组件 react-anchor-without-hash,它使用了类似原生 a 标签的写法,并且可以支持滚动的距离和

前端努力的哪怕从代码的体积哪怕是20K都在努力减少的同时

久以前在安卓2.0系统刚刚的时候就对HTML5比较关注!因为我也是那个时候刚刚入行做前端的.那个时候最大的乐趣就是看着w3plus上面各种css3的效果,觉得哇,好牛逼原来可以这样做,然后3年过去了...手上的APP做完的没有40个也有30个了!然后去年参加了HTML5峰会.听着一批前辈们说着他们在html5的道路中遇到的挫折,经验,以及流行的框架,制作HTML5的ide...也算是小有经验了!...然后知道的越多,现实就越残酷(大漠竟然说他不会JS,无语偶曾经的偶像竟然说他真的不会js还发誓!

Java中的HashCode(1)之hash算法基本原理

Java中的HashCode(1)之hash算法基本原理 2012-11-16 14:58:59     我来说两句      作者:woshixuye 收藏    我要投稿 一.为什么要有Hash算法 Java中 的集合有两类,一类是List,一类是Set.List内的元素是有序的,元素可以重复.Set元素无序,但元素不可重复.要想保证元素不重复,两个元素 是否重复应该依据什么来判断呢?用Object.equals方法.但若每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的

前端工程师也要关注代码版本控制

那么,为什么说前端工程师也要关注代码版本控制呢?因为web开发和软件开发本质无异,同样具有迭代周期,需求不是一揽子提完.一口气开发完的,是有步骤的开发,因此,每次上线开发哪些功能.为后续扩展功能留足哪些接口.代码在可扩展和可维护性上应当作哪些考虑……,这些应当是每个工程师关注的事情,所谓迭代就是指这种需求的叠加,这是软件开发的常态,也是web开发的常态,刚开始,前端工程师总会不断抱怨没完没了的需求,代码起初还算干净,但很快就越来越乱,代码的版本管理对于Web前端工程师来说有些困难,这也使得大部分

HahsRouter hash 路由

无刷新页面,切换视图,用hash 实现路由切换,本身附带history记录,简单舒服. 最近用vue,看到vue-route的路由,做单页应用切换视图真心易如反掌,分分钟爽到不行.为了加深理解其内涵原理,遂决意写一个最简单的hash 路由. 思路很简单,自己维护一个 hash route 的哈希表,通过注册路由及其处理事件,通过hashchange来触发对应事件处理,有点像观察者模式的思想,先注册,再派发. 实现方法 maps 批量注册 add 单条注册 remove 单条删除 clear 全部

Javascript实现前端简单路由

http://www.helloweba.com/view-blog-385.html WEB开发中路由概念并不陌生,我们接触到的有前端路由和后端路由.后端路由在很多框架中是一个重要的模块,如Thinkphp,Wordpress中都应用了路由功能,它能够让请求的url地址变得更简洁.同样前端路由在单页面应用也很常见,它使得前端页面体验更流畅. 前端路由在很多开源的js类库框架中都得到支持,如angularJS,Backbone,Reactjs等等.前端路由和后端路由原理一样,是让所有的交互和展现

为移动端开发提供纯前端的路由方案

市面上有大量的SPA框架,如AngularJs, backbone, Knockout等,对于追求极致小得移动端来说, 都比较大,重! 正在苦恼的时候,我们的wikieswan解决了这一问题.github地址:vipspa 使用方法非常的简单: 1 <!doctype html> 2 <html> 3 <head> 4 <meta charset="utf-8" > 5 <meta name="viewport"