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 相关文章推荐
求解开jscript.encode代码的asp函数
Feb 28 Javascript
关于使用runtimeStyle属性问题讨论文章
Mar 08 Javascript
jquery的$getjson调用并获取远程的JSON字符串问题
Dec 10 Javascript
利用cookie记住背景颜色示例代码
Nov 04 Javascript
jQuery实现冻结表头的方法
Mar 09 Javascript
JS显示下拉列表框内全部元素的方法
Mar 31 Javascript
JS控制TreeView的结点选择
Nov 11 Javascript
web前端vue之vuex单独一文件使用方式实例详解
Jan 11 Javascript
深入浅析JS中的严格模式
Jun 04 Javascript
微信小程序支付功能 php后台对接完整代码分享
Jun 12 Javascript
vue中使用better-scroll实现滑动效果及注意事项
Nov 15 Javascript
Vue实现附件上传功能
May 28 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分页效率终结版(推荐)
2013/07/01 PHP
FireFox浏览器使用Javascript上传大文件
2013/10/30 PHP
php实现分页工具类分享
2014/01/09 PHP
php获取本周星期一具体日期的方法
2015/04/20 PHP
php实现替换手机号中间数字为*号及隐藏IP最后几位的方法
2016/11/16 PHP
yii2 commands模式以及配置crontab定时任务的方法
2017/08/19 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
在线编辑器的实现原理(兼容IE和FireFox)
2007/03/09 Javascript
jQuery jcrop插件截图使用方法
2013/11/20 Javascript
基于JQuery实现的图片自动进行缩放和裁剪处理
2014/01/31 Javascript
JavaScript通过正则表达式实现表单验证电话号码
2014/03/07 Javascript
JavaScript中Function详解
2015/02/27 Javascript
对Web开发中前端框架与前端类库的一些思考
2015/03/27 Javascript
基于jQuery和CSS3制作响应式水平时间轴附源码下载
2015/12/20 Javascript
JS获取填报扩展单元格控件的值的解决办法
2017/07/14 Javascript
JavaScript实现QQ列表展开收缩扩展功能
2017/10/30 Javascript
基于Vue的移动端图片裁剪组件功能
2017/11/28 Javascript
浅谈Redux中间件的实践
2018/07/27 Javascript
vue定义全局变量和全局方法的方法示例
2018/08/01 Javascript
javascript 对象 与 prototype 原型用法实例分析
2019/11/11 Javascript
python下os模块强大的重命名方法renames详解
2017/03/07 Python
django开发教程之利用缓存文件进行页面缓存的方法
2017/11/10 Python
Python实现12306火车票抢票系统
2019/07/04 Python
python通过SSH登陆linux并操作的实现
2019/10/10 Python
python实现简单图书管理系统
2019/11/22 Python
Python实现名片管理系统
2020/02/14 Python
linux mint中搜狗输入法导致pycharm卡死的问题
2020/10/28 Python
英国大码女性时装零售商:Evans
2018/08/29 全球购物
俄罗斯花园种植材料批发和零售网上商店:Беккер
2019/07/22 全球购物
惠而浦美国官网:Whirlpool.com
2021/01/19 全球购物
趣味运动会活动方案
2014/02/12 职场文书
幼儿园社区活动总结
2014/07/07 职场文书
同学聚会感言一句话
2015/07/30 职场文书
公司借款担保书
2015/09/22 职场文书
python四种出行路线规划的实现
2021/06/23 Python
MySQL主从切换的超详细步骤
2022/06/28 MySQL