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 相关文章推荐
经典的解除许多网站无法复制文字的绝招
Dec 31 Javascript
jquery ajax 简单范例(界面+后台)
Nov 19 Javascript
关于javaScript注册click事件传递参数的不成功问题
Jul 18 Javascript
Angularjs中UI Router的使用方法
May 14 Javascript
深入浅析jQuery对象$.html
Aug 22 Javascript
jquery Ajax 全局调用封装实例详解
Jan 16 Javascript
详解Vue 开发模式下跨域问题
Jun 06 Javascript
js Date()日期函数浏览器兼容问题解决方法
Sep 12 Javascript
详解ES6中的Map与Set集合
Mar 22 Javascript
JavaScript中变量提升机制示例详解
Dec 27 Javascript
JavaScript中window和document用法详解
Jul 28 Javascript
一起深入理解js中的事件对象
Feb 06 Javascript
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中文件缓存转内存缓存的方法
2011/12/06 PHP
PHP中的traits简单使用实例
2015/05/13 PHP
ajax+php控制所有后台函数调用
2015/07/15 PHP
JavaScript 无符号右移运算符
2009/04/17 Javascript
javascript写的一个链表实现代码
2009/10/25 Javascript
js创建对象的几种常用方式小结(推荐)
2010/10/24 Javascript
jQuery powerFloat万能浮动层下拉层插件使用介绍
2010/12/27 Javascript
改进UCHOME的记录发布,增强可访问性用户体验
2011/01/17 Javascript
详解AngularJS Filter(过滤器)用法
2015/12/28 Javascript
Highcharts入门之简介
2016/08/02 Javascript
一篇看懂vuejs的状态管理神器 vuex状态管理模式
2017/04/20 Javascript
bootstrap daterangepicker双日历时间段选择控件详解
2017/06/15 Javascript
Javascript中toFixed计算错误(依赖银行家舍入法的缺陷)解决方法
2017/08/22 Javascript
详解Vue快速零配置的打包工具——parcel
2018/01/16 Javascript
JavaScript设计模式之调停者模式实例详解
2018/02/03 Javascript
angular基于ng-alain定义自己的select组件示例
2018/02/23 Javascript
Vue-router中hash模式与history模式的区别详解
2020/12/15 Vue.js
numpy数组拼接简单示例
2017/12/15 Python
详解django+django-celery+celery的整合实战
2019/03/19 Python
Python提取特定时间段内数据的方法实例
2019/04/01 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
2019/08/05 Python
Python matplotlib生成图片背景透明的示例代码
2019/08/30 Python
PHP统计代码行数的小代码
2019/09/19 Python
Tensorflow之MNIST CNN实现并保存、加载模型
2020/06/17 Python
CSS3 实现的加载动画
2020/12/07 HTML / CSS
UGG澳洲官网:UGG Australia
2018/04/26 全球购物
网络工程师个人的自我评价范文
2013/10/01 职场文书
人事科岗位职责范本
2014/03/02 职场文书
2014年单位植树节活动方案
2014/03/23 职场文书
企业指导教师评语
2014/04/28 职场文书
公司节能减排倡议书
2014/05/14 职场文书
2014年客房服务员工作总结
2014/11/18 职场文书
财产保全担保书
2015/01/20 职场文书
装饰施工员岗位职责
2015/04/11 职场文书
恰同学少年观后感
2015/06/08 职场文书
Ajax请求超时与网络异常处理图文详解
2021/05/23 Javascript