单页面路由实现原理-history

Posted 芜独独

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单页面路由实现原理-history相关的知识,希望对你有一定的参考价值。

单页面路由实现原理

history对象

主要使用了pushState()和popstate事件

pushState()可以改变url地址,而不刷新页面
popstate事件在浏览器点击前进后退时触发

pushState(state,title,url)有三个参数:
1.state:可在用户在浏览器点击前进后退时,他会以回调的方式,传入一些数据
2.title:新页面的标题
3.url:新的网址,在浏览器地址栏显示

代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>单页面路由实现原理-history</title>
    <style type="text/css">
        a,
        #divId 
            font-size: 33px;
        
    </style>
</head>

<body>
    <!-- data-url是自定义的属性 -->
    <ul>
        <li><a data-url="#/aa">aaa</a></li>
        <li><a data-url="#/bb">bbb</a></li>
        <li><a data-url="#/cc">ccc</a></li>
    </ul>
    <div id="divId">默认内容</div>
</body>
<script>
    // 路由数据
    var _routeData = [
        path: '#/aa',
        pathData: 'aaaaaa页'
    , 
        path: '#/bb',
        pathData: 'bbbbbb页'
    , 
        path: '#/cc',
        pathData: 'cccccc页'
    , ];
    // 获取数据
    var _aBtn = document.getElementsByTagName("a");
    // 内容区
    var _divId = document.getElementById("divId");
    // 路由变量
    var _path;

    // 更新视图
    function refresh(_path) 
        // 修改匹配内容
        _routeData.map(item => 
            // 当路由匹配时,更改div里面的内容
            if (_path == item.path) 
                _divId.innerHTML = item.pathData;
            
        )
    
    for (var i = 0; i < _aBtn.length; i++) 
        // 批量处理监听按钮事件
        _aBtn[i].addEventListener('click', function() 
            // console.log(this.getAttribute('data-url')); 检查按钮是否被监听到
            _path = this.getAttribute('data-url');
            // 通过pushState传入url地址
            history.pushState(
                a: 'talk is cheap , show me the code' //传入数据
            , null, _path);
            // 调用更新视图的方法
            refresh(_path)
        )
    
    // 点击浏览器前进后退时popstate才会触发
    window.addEventListener('popstate', function(_a) 
        console.log(location.hash); //获取url中#右边的部分
        refresh(location.hash); //点击页面前进后退也会更新div的内容
        console.log(_a); //检验数据是否被传入,state里面
    )
</script>

</html>

以上是关于单页面路由实现原理-history的主要内容,如果未能解决你的问题,请参考以下文章

vue-router路由跳转原理

利用hash或history实现单页面路由

vue路由原理剖析

前端路由原理之 hash 模式和 history 模式

单页面路由的history模式后端配置

单页面路由的history模式后端配置