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

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

什么是路由?

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

什么是单页应用?

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

如何知道URL切换了呢?

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

#/html

#/css

#/javascript

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

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

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

rush:xhtml;">
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来做一个选项卡切换的功能:

rush:css;"> 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;
}
rush:xhtml;">
头部
右边
rush:js;"> (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从<a href="https://www.jb51.cc/tag/rumendaojingtong/" target="_blank" class="keywords">入门到精通</a>的课程';
});
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系列课程";
});

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...