js单页hash路由原理与应用实战详解


Posted in Javascript onAugust 14, 2017

本文主要介绍了js单页hash路由原理与应用实战详解,分享给大家,具体如下:

什么是路由?

通俗点说,就是不同的URL显示不同的内容

什么是单页应用?

单页,英文缩写为SPA( Single Page Application),就是把各种功能做在一个页面内. 那所谓的单页路由应用就是:在一个页面内,通过切换地址栏的URL来实现切换内容的变化.

如何知道URL切换了呢?

当url后面的锚文本发生变化时, 会触发onhashchange事件。通过这个事件,我们就可以对不同的URL 做出不同的处理。锚文本就是 URL中 #后面的内容,比如:

#/html

#/css

#/javascript

<a href="#/html" rel="external nofollow" rel="external nofollow" >html课程</a> 
<a href="#/css" rel="external nofollow" rel="external nofollow" >css课程</a>
window.onload = function(){
      //当hash发生变化的时候, 会产生一个事件 onhashchange
      window.onhashchange = function(){
        console.log( '你的hash改变了' );
        //location对象是 javascript内置的(自带的)
        console.log( location );
      }
    }

上例,我们已经通过hash( 就是锚文本 ) 变化, 触发了onhashchange事件, 就可以把hash变化 与 内容 切换对应起来,就实现了单页路由的应用!

接下来,我们通过一个小的彩票程序,来体验下单页路由:

<input type="button" value="33选5">
 <div></div>
window.onload = function(){
      var oBtn = document.querySelector("input");
      var oDiv = document.querySelector("div");
      //33->max 5->num
      function buildNum( max, num ){
        var arr = [];
        for( var i = 0; i < max; i++ ){
          arr.push( i + 1 );
        }
        var target = []; //从1-33这33个数字中 随机选出5个数
        for( var i = 0; i < num; i++ ){
          target.push( arr.splice( Math.floor( Math.random() * arr.length ), 1 ) );
        }
        return target;
      }
      oBtn.onclick = function(){
        var num = buildNum( 33, 5 );
        oDiv.innerHTML = num;
        location.hash = num;
      }
      window.onhashchange = function(){
        oDiv.innerHTML = location.hash.substring(1);
      }
    }

上例,我们通过1-33个数字,生成5个随机数,放入Div中,  每次生成一组随机数就更新div的内容,  最后通过浏览器的前进,后退按钮,就可以感觉,所有的随机切换内容像是在切换不同的URL页面, 实际的效果是没有切换任何页面,完全是在一个页面中通过hash变化实现内容切换.

最后,我们结合html5简单的排版,利用hash来做一个选项卡切换的功能:

header,
    footer {
      height: 100px;
      background: #ccc;
    }

    section {
      width: 60%;
      height: 400px;
      background: #eee;
      float: left;
    }

    sidebar {
      width: 40%;
      height: 400px;
      background: #999;
      float: left;
    }

    .clear {
      clear: both;
    }
<header>
    头部
  </header>
  <section>
    <ul>
      <li><a href="#/" rel="external nofollow" >全部</a></li>
      <li><a href="#/html" rel="external nofollow" rel="external nofollow" >html课程</a></li>
      <li><a href="#/css" rel="external nofollow" rel="external nofollow" >css课程</a></li>
      <li><a href="#/javascript" rel="external nofollow" >javascript课程</a></li>
    </ul>
  </section>
  <sidebar>
    右边
  </sidebar>
  <div class="clear"></div>
  <footer>
    底部
  </footer>
(function(){
      var Router = function(){
        /*
          this.routes['/'] = function(){}  
          this.routes['/html'] = function(){}
        */ 
        this.routes = {};//用来保存路由
        this.curUrl = ''; //获取当前的hash
      }
      Router.prototype.init = function(){ //监听路由变化
        //call,apply
        window.addEventListener( 'hashchange', this.reloadPage.bind(this) );
      }
      Router.prototype.reloadPage = function(){
        this.curUrl = location.hash.substring(1) || '/';
        this.routes[this.curUrl]();    
      }
      Router.prototype.map = function( key, callback ){ //保存路由对应的函数
        this.routes[key] = callback;
        // console.log( this.routes );
      } 
      window.Router = Router;
    })();

    var oRouter = new Router();
    oRouter.init();
    oRouter.map( '/', function(){
      var oSidebar = document.querySelector("sidebar");
      oSidebar.innerHTML = 'ghostwu提供html,css,javascript从0基础到精通系列课程,只要会开关机,就能学会';
    });
    oRouter.map('/html', function(){
      var oSidebar = document.querySelector("sidebar");
      oSidebar.innerHTML = 'ghostwu提供html5从入门到精通的课程';
    });
    oRouter.map('/css', function(){
      var oSidebar = document.querySelector("sidebar");
      oSidebar.innerHTML = 'ghostwu提供从入门到玩转css3课程';
    });
    oRouter.map('/javascript', function(){
      var oSidebar = document.querySelector("sidebar");
      oSidebar.innerHTML = "ghostwu提供从0基础到精通javascript系列课程";
    });

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于SVG的web页面图形绘制API介绍及编程演示
Jun 28 Javascript
jQuery实现tag便签去重效果的方法
Jan 20 Javascript
JS 获取HTML标签内的子节点的方法
Sep 21 Javascript
微信小程序 列表的上拉加载和下拉刷新的实现
Apr 01 Javascript
Bootstrap table学习笔记(2) 前后端分页模糊查询
May 18 Javascript
JS动态添加的div点击跳转到另一页面实现代码
Sep 30 Javascript
angularjs实现天气预报功能
Jun 16 Javascript
webpack配置打包后图片路径出错的解决
Apr 26 Javascript
浅谈react-router@4.0 使用方法和源码分析
Jun 04 Javascript
Vue.directive 实现元素scroll逻辑复用
Nov 29 Javascript
js实现无限层级树形数据结构(创新算法)
Feb 27 Javascript
jQuery实现鼠标滑动切换图片
May 27 jQuery
jQuery选择器特殊字符与属性空格问题
Aug 14 #jQuery
详解升级react-router 4 踩坑指南
Aug 14 #Javascript
javaScript封装的各种写法
Aug 14 #Javascript
vue教程之toast弹框全局调用示例详解
Aug 24 #Javascript
vue2.0项目中使用Ueditor富文本编辑器示例代码
Aug 14 #Javascript
jQuery实现手势解锁密码特效
Aug 14 #jQuery
Vue+Element使用富文本编辑器的示例代码
Aug 14 #Javascript
You might like
PHP 中文处理技巧
2010/04/25 PHP
php使用Smarty的相关注意事项及访问变量的几种方式
2011/12/08 PHP
全面解析PHP面向对象的三大特征
2017/06/10 PHP
PHP dirname(__FILE__)原理及用法解析
2020/10/28 PHP
JavaScript原型继承之基础机制分析
2011/08/26 Javascript
基于Jquery代码实现手风琴菜单
2015/11/19 Javascript
JavaScript DOM 学习总结(五)
2015/11/24 Javascript
jquery插件之文字间歇自动向上滚动效果代码
2016/02/25 Javascript
javascript常见数字进制转换实例分析
2016/04/21 Javascript
vue2 router 动态传参,多个参数的实例
2017/11/10 Javascript
Vue动态获取width的方法
2018/08/22 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【凹多边形的分离轴检测算法】
2018/12/13 Javascript
jquery实现弹窗(系统提示框)效果
2019/12/10 jQuery
JavaScript 引用类型实例详解【数组、对象、严格模式等】
2020/05/13 Javascript
[02:26]DOTA2英雄米拉娜基础教程
2013/11/25 DOTA
python读取oracle函数返回值
2016/07/18 Python
Python生成密码库功能示例
2017/05/23 Python
Python实现的求解最大公约数算法示例
2018/05/03 Python
详解分布式任务队列Celery使用说明
2018/11/29 Python
python实现kNN算法识别手写体数字的示例代码
2019/08/16 Python
Sephora丝芙兰马来西亚官方网站:国际化妆品购物
2018/03/15 全球购物
eBay加拿大站:eBay.ca
2019/06/20 全球购物
平面设计岗位职责
2013/12/14 职场文书
五一家具促销方案
2014/01/10 职场文书
客服专员岗位职责
2014/02/28 职场文书
广告创意求职信
2014/03/17 职场文书
娱乐节目策划方案
2014/06/10 职场文书
舞蹈兴趣小组活动总结
2014/07/07 职场文书
2014卖家双十一活动策划书
2014/09/29 职场文书
幼儿园新学期开学寄语
2015/05/27 职场文书
开业庆典嘉宾致辞
2015/08/01 职场文书
2015年学校消防安全工作总结
2015/10/14 职场文书
2015年乡镇食品安全工作总结
2015/10/22 职场文书
使用 CSS 轻松实现一些高频出现的奇形怪状按钮
2021/12/06 HTML / CSS
2022年四月新番
2022/03/15 日漫
Win11自动黑屏怎么办 Win11自动黑屏设置教程
2022/07/15 数码科技