美文网首页H5开发Vue.js专区
H5 路由的两种实现

H5 路由的两种实现

作者: 风之化身呀 | 来源:发表于2017-07-09 15:14 被阅读716次

1、原理浅析

  • hash模式
    如果a标签的href属性以"#"开头,那么当点击这个a标签时就会触发hashchange事件,在该事件处理函数中可以做很多事,比如发ajax请求,进行DOM操作替换页面等。
  • history模式
    hisroty模式相比hash模式,是一种比较新的路由模式,其浏览器兼容性如下:
pushState浏览器兼容性

原理就是利用history.pushState(state,null,url)更新浏览器url地址

2、具体实现

Talk is easy,show you the Code!

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Hash Test</title>
</head>
<body>
    <a href="#1">#1</a>
    <a href="#2">#2</a>
    <div id="content"></div>
    <script type='text/js-template' class="test" id="1">第一页</script>
    <script type='text/js-template' class="test" id="2">第二页</script>
    <script type="text/javascript">
        //1、选取元素
        var aElm=document.getElementsByTagName('a');
        var array=[].slice.call(aElm)
        var content=document.getElementById('content')
        //2、特性检测,如果支持history模式就用history,否则用hash模式
        if (history&&history.pushState) {
            window.addEventListener('popstate',handlePage);
            //劫持a元素的click事件,主要是为了更新history.state的状态以及替换url,当点击url跳转时先执行onclick再触发popstate
            array.forEach(function(v){
                v.onclick=function(event){
                    var path=event.target.hash.split("#")[1];
                    var newUrl=location.href.split('#')[0]+'\/'+path;
                    history.pushState({current:path},null,newUrl)
                }
            })
        } else {
            window.addEventListener('hashchange',handlePage);
        }
             //3、统一使用handlePage作为两种模式的事件处理器
        function handlePage(){
            if (history&&history.pushState) {
                var current=history.state&&history.state.current||'1';
                render(current)
            } else {
                var hash=location.hash||'#1';
                render(hash,true)
            }
            function render(selector,isHashMode){
                var hashMode=isHashMode&&true;
                var select='';
                if (hashMode) {
                    select=selector.split('#')[1];
                } else {
                    select=selector||history.state.current
                }
                var toPage=document.getElementById(select);
                content.innerHTML=toPage.innerHTML;
            }
        }
        handlePage();
    </script>
</body>
</html>

3、需要注意的地方

  • pushState的第三个参数url是不能跨域的
  • pushState并不能触发popstate事件,只有浏览器的前进返回才能触发popstate

参考:单页面应用路由实现原理:以 React-Router 为例

相关文章

  • 前端路由实现

    前端路由一般分为两种方式 hash路由 H5 History路由 简单介绍下这两个路由: hash路由 标志:ha...

  • H5 路由的两种实现

    1、原理浅析 hash模式如果a标签的href属性以"#"开头,那么当点击这个a标签时就会触发hashchange...

  • React-Router知识点

    路由的分类 页面路由 hash 路由 h5路由 react路由 react-router-dom 路由方式 h5路...

  • React-Router的理解与实现

    前端两种路由方案 无hash通过h5的pushState、replaceState、go、forward、back...

  • Hash Vs H5 History

    当大家在写较为复杂一点的SPA时,都会使用到路由。 前端路由有两种模式: Hash模式 H5 history 模式...

  • 前端中的 hash 和 history 路由

    前端路由有有 hash 路由和 history 路由两种路由方式,他们的原理是什么,又怎样实现一个简单的路由监听呢...

  • vue 返回上一页面保持之前的滚动条位置

    前言 h5 移动端项目,列表返回详情,需要保持之前位置不变。 实现方式 需要保持滚动条的页面路由做标记。 路由钩子...

  • vue面试题(第九天)

    1.Vue路由的实现原理 更新视图但不重新请求页面,是前端路由原理的核心之一 vue路由的实现有两种模式<1>ha...

  • vue路由懒加载及组件懒加载

    路由 和 组件 的常用两种懒加载方式:1、vue异步组件实现路由懒加载component:resolve=>(['...

  • SPA 中前端路由原理与实现方式

    SPA 中前端路由原理与实现方式 通常 SPA 中前端路由有2中实现方式,本文会简单快速总结这两种方法及其实现: ...

网友评论

本文标题:H5 路由的两种实现

本文链接:https://www.haomeiwen.com/subject/eigshxtx.html