视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
js单页hash路由原理与应用实战详解
2020-11-27 22:32:50 责编:小采
文档


本文主要介绍了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系列课程";
 });

下载本文
显示全文
专题