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 相关文章推荐
window.addeventjs事件驱动函数集合addEvent等
Feb 19 Javascript
JavaScript之自定义类型
May 04 Javascript
js验证上传图片的方法
May 12 Javascript
Vue.js创建Calendar日历效果
Nov 03 Javascript
巧用Vue.js+Vuex制作专门收藏微信公众号的app
Nov 03 Javascript
Bootstarp 基础教程之表单部分实例代码
Feb 03 Javascript
ES6新特性之数组、Math和扩展操作符用法示例
Apr 01 Javascript
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
Aug 16 Javascript
jQuery实现所有验证通过方可提交的表单验证
Nov 21 jQuery
解决vue+webpack打包路径的问题
Mar 06 Javascript
修改npm全局安装模式的路径方法
May 15 Javascript
jquery添加div实现消息聊天框
Feb 08 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 的 __FILE__ 常量
2007/01/15 PHP
Apache连接PHP后无法启动问题解决思路
2015/06/18 PHP
js可突破windows弹退效果代码
2008/08/09 Javascript
JavaScript写的一个自定义弹出式对话框代码
2010/01/17 Javascript
javascript 循环读取JSON数据的代码
2010/07/17 Javascript
基于jquery的使ListNav兼容中文首字拼音排序的实现代码
2011/07/10 Javascript
js下将字符串当函数执行的方法
2011/07/13 Javascript
jQuery EasyUI API 中文文档 - Documentation 文档
2011/09/29 Javascript
提高javascript效率 一次判断,而不要次次判断
2012/03/30 Javascript
使用js判断当前时区TimeZone是否是夏令时
2014/02/23 Javascript
在浏览器中打开或关闭JavaScript的方法
2015/06/03 Javascript
动态更新highcharts数据的实现方法
2016/05/28 Javascript
vue 实现通过vuex 存储值 在不同界面使用
2019/11/11 Javascript
html+vue.js 实现漂亮分页功能可兼容IE
2020/11/07 Javascript
Python实现抓取网页并且解析的实例
2014/09/20 Python
在Python中使用HTML模版的教程
2015/04/29 Python
python取数作为临时极大值(极小值)的方法
2018/10/15 Python
浅谈python中真正关闭socket的方法
2018/12/18 Python
使用python判断jpeg图片的完整性实例
2019/06/10 Python
Python实现井字棋小游戏
2020/03/09 Python
matplotlib.pyplot.plot()参数使用详解
2020/07/28 Python
CSS3选择器新增问题的实现
2021/01/21 HTML / CSS
千元咖啡店的创业计划书范文
2013/12/29 职场文书
会计主管岗位职责
2014/01/03 职场文书
大学毕业自我鉴定范文
2014/02/03 职场文书
歌颂祖国演讲稿
2014/05/04 职场文书
运动会拉拉队口号
2014/06/09 职场文书
师范类求职信
2014/06/21 职场文书
个人查摆问题整改措施
2014/10/04 职场文书
违反交通安全法检讨书
2014/10/24 职场文书
求职简历自荐信怎么写
2015/03/26 职场文书
电影地道战观后感
2015/06/04 职场文书
企业反腐倡廉心得体会
2015/08/15 职场文书
创业开店,这样方式更合理
2019/08/26 职场文书
python实现求纯色彩图像的边框
2021/04/08 Python
python爬虫框架feapde的使用简介
2021/04/20 Python