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 相关文章推荐
EasyUI中的tree用法介绍
Nov 01 Javascript
ASP.NET MVC中EasyUI的datagrid跨域调用实现代码
Mar 14 Javascript
Javascript面向对象编程
Mar 18 Javascript
当鼠标移动时出现特效的JQuery代码
Nov 08 Javascript
简介JavaScript中search()方法的使用
Jun 06 Javascript
简述jQuery ajax的执行顺序
Jan 05 Javascript
全面理解闭包机制
Jul 11 Javascript
Angularjs 动态改变title标题(兼容ios)
Dec 29 Javascript
PHP7新特性简述
Jun 11 Javascript
Angular2开发环境搭建教程之VS Code
Dec 15 Javascript
聊聊JS动画库 Velocity.js的使用
Mar 13 Javascript
vue3.0 的 Composition API 的使用示例
Oct 26 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
ajax php 实现写入数据库
2009/09/02 PHP
php实现把url转换迅雷thunder资源下载地址的方法
2014/11/07 PHP
[原创]php逐行读取txt文件写入数组的方法
2015/07/02 PHP
简单理解PHP的面向对象编程方式
2016/05/17 PHP
IIS 7.5 asp Session超时时间设置方法
2017/04/17 PHP
PHP使用redis位图bitMap 实现签到功能
2019/10/08 PHP
JavaScript中Math对象使用说明
2008/01/16 Javascript
jquery控制listbox中项的移动并排序的实现代码
2010/09/28 Javascript
在javascript中关于节点内容加强
2013/04/11 Javascript
JavaScript等比例缩放图片控制超出范围的图片
2013/08/06 Javascript
最短的IE判断var ie=!-[1,]分析
2014/05/28 Javascript
jquery学习总结(超级详细)
2014/09/04 Javascript
用jQuery获取table中行id和td值的实现代码
2016/05/19 Javascript
AngularJS读取JSON及XML文件的方法示例
2017/05/25 Javascript
Angular.js自动化测试之protractor详解
2017/07/07 Javascript
js实现图片粘贴上传到服务器并展示的实例
2017/11/08 Javascript
Vue 实现展开折叠效果的示例代码
2018/08/27 Javascript
微信小程序的注册页面包含倒计时验证码、获取用户信息
2019/05/22 Javascript
利用python程序帮大家清理windows垃圾
2017/01/15 Python
Python列表推导式与生成器用法分析
2018/08/02 Python
Python判断字符串是否为字母或者数字(浮点数)的多种方法
2018/08/03 Python
Python中如何导入类示例详解
2019/04/17 Python
python线程里哪种模块比较适合
2020/08/02 Python
python 如何读、写、解析CSV文件
2021/03/03 Python
举例详解CSS3中的Transition
2015/07/15 HTML / CSS
阿联酋航空丹麦官方网站:Emirates DK
2019/08/25 全球购物
行政办公员自我评价分享
2013/12/14 职场文书
竞选班长演讲稿
2013/12/30 职场文书
简单的辞职信范文
2014/01/18 职场文书
励志演讲稿600字
2014/08/21 职场文书
2014党员四风对照检查材料思想汇报
2014/09/17 职场文书
2015年敬老院工作总结
2015/05/18 职场文书
公司老总年会致辞
2015/07/30 职场文书
民间借贷纠纷起诉书
2015/08/03 职场文书
使用nginx动态转换图片大小生成缩略图
2021/03/31 Servers
浅谈Python中对象是如何被调用的
2022/04/06 Python