资讯专栏INFORMATION COLUMN

[js高手之路]js单页hash路由原理与应用实战

tinna / 3437人阅读

摘要:什么是路由通俗点说,就是不同的显示不同的内容什么是单页应用单页,英文缩写为,就是把各种功能做在一个页面内那所谓的单页路由应用就是在一个页面内,通过切换地址栏的来实现切换内容的变化如何知道切换了呢当后面的锚文本发生变化时,会触发事件。

什么是路由?

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

什么是单页应用?

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

如何知道URL切换了呢?

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

/html /css /javascript
1 html课程 
2 css课程 
1         window.onload = function(){
2             //当hash发生变化的时候, 会产生一个事件 onhashchange
3             window.onhashchange = function(){
4                 console.log( "你的hash改变了" );
5                 //location对象是 javascript内置的(自带的)
6                 console.log( location );
7             }
8         }

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

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

1 
2  
1 window.onload = function(){ 2 var oBtn = document.querySelector("input"); 3 var oDiv = document.querySelector("div"); 4 //33->max 5->num 5 function buildNum( max, num ){ 6 var arr = []; 7 for( var i = 0; i < max; i++ ){ 8 arr.push( i + 1 ); 9 } 10 var target = []; //从1-33这33个数字中 随机选出5个数 11 for( var i = 0; i < num; i++ ){ 12 target.push( arr.splice( Math.floor( Math.random() * arr.length ), 1 ) ); 13 } 14 return target; 15 } 16 oBtn.onclick = function(){ 17 var num = buildNum( 33, 5 ); 18 oDiv.innerHTML = num; 19 location.hash = num; 20 } 21 window.onhashchange = function(){ 22 oDiv.innerHTML = location.hash.substring(1); 23 } 24 }

上例,我们通过1-33个数字,生成5个随机数,放入Div中, 每次生成一组随机数就更新div的内容, 最后通过浏览器的前进,后退按钮,就可以感觉,所有的随机切换内容像是在切换不同的URL页面, 实际的效果是没有切换任何页面,完全是在一个页面中通过hash变化实现内容切换.

最后,我们结合html5简单的排版,利用hash来做一个选项卡切换的功能:

1 header,
 2         footer {
 3             height: 100px;
 4             background: #ccc;
 5         }
 6 
 7         section {
 8             width: 60%;
 9             height: 400px;
10             background: #eee;
11             float: left;
12         }
13 
14         sidebar {
15             width: 40%;
16             height: 400px;
17             background: #999;
18             float: left;
19         }
20 
21         .clear {
22             clear: both;
23         }
1 
2 头部 3
4
5 11
12 13 右边 14 15
16
17 底部 18
1 (function(){
 2             var Router = function(){
 3                 /*
 4                     this.routes["/"] = function(){}    
 5                     this.routes["/html"] = function(){}
 6                 */ 
 7                 this.routes = {};//用来保存路由
 8                 this.curUrl = ""; //获取当前的hash
 9             }
10             Router.prototype.init = function(){ //监听路由变化
11                 //call,apply
12                 window.addEventListener( "hashchange", this.reloadPage.bind(this) );
13             }
14             Router.prototype.reloadPage = function(){
15                 this.curUrl = location.hash.substring(1) || "/";
16                 this.routes[this.curUrl]();       
17             }
18             Router.prototype.map = function( key, callback ){ //保存路由对应的函数
19                 this.routes[key] = callback;
20                 // console.log( this.routes );
21             } 
22             window.Router = Router;
23         })();
24 
25         var oRouter = new Router();
26         oRouter.init();
27         oRouter.map( "/", function(){
28             var oSidebar = document.querySelector("sidebar");
29             oSidebar.innerHTML = "ghostwu提供html,css,javascript从0基础到精通系列课程,只要会开关机,就能学会";
30         });
31         oRouter.map("/html", function(){
32             var oSidebar = document.querySelector("sidebar");
33             oSidebar.innerHTML = "ghostwu提供html5从入门到精通的课程";
34         });
35         oRouter.map("/css", function(){
36             var oSidebar = document.querySelector("sidebar");
37             oSidebar.innerHTML = "ghostwu提供从入门到玩转css3课程";
38         });
39         oRouter.map("/javascript", function(){
40             var oSidebar = document.querySelector("sidebar");
41             oSidebar.innerHTML = "ghostwu提供从0基础到精通javascript系列课程";
42         });

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/84911.html

相关文章

  • 前端学习之路之SPA(单页应用)设计原理

    摘要:设计设计意义前后端分离减轻服务器压力增强用户体验预渲染优化前后端分离前端做业务逻辑,后端处理数据和接口,耦合度减少,开发效率提高。响应浏览器的前进和后退。代码实现演示图结上就是设计原理愿你成为终身学习者 SPA设计 1、设计意义 前后端分离 减轻服务器压力 增强用户体验 Prerender预渲染优化SEO 前后端分离:前端做业务逻辑,后端处理数据和接口,耦合度减少,开发效率提高。 ...

    Crazy_Coder 评论0 收藏0
  • 前端学习之路之SPA(单页应用)设计原理

    摘要:设计设计意义前后端分离减轻服务器压力增强用户体验预渲染优化前后端分离前端做业务逻辑,后端处理数据和接口,耦合度减少,开发效率提高。响应浏览器的前进和后退。代码实现演示图结上就是设计原理愿你成为终身学习者 SPA设计 1、设计意义 前后端分离 减轻服务器压力 增强用户体验 Prerender预渲染优化SEO 前后端分离:前端做业务逻辑,后端处理数据和接口,耦合度减少,开发效率提高。 ...

    Barry_Ng 评论0 收藏0
  • 从头开始学习vue-router

    摘要:路由模块的本质就是建立起和页面之间的映射关系。这时候我们可以直接利用传值了使用来匹配路由,然后通过来传递参数跳转对应路由配置于是我们可以获取参数六配置子路由二级路由实际生活中的应用界面,通常由多层嵌套的组件组合而成。 一、前言 要学习vue-router就要先知道这里的路由是什么?为什么我们不能像原来一样直接用标签编写链接哪?vue-router如何使用?常见路由操作有哪些?等等这些问...

    tommego 评论0 收藏0
  • 从头开始学习vue-router

    摘要:路由模块的本质就是建立起和页面之间的映射关系。这时候我们可以直接利用传值了使用来匹配路由,然后通过来传递参数跳转对应路由配置于是我们可以获取参数六配置子路由二级路由实际生活中的应用界面,通常由多层嵌套的组件组合而成。 一、前言 要学习vue-router就要先知道这里的路由是什么?为什么我们不能像原来一样直接用标签编写链接哪?vue-router如何使用?常见路由操作有哪些?等等这些问...

    jhhfft 评论0 收藏0
  • 从头开始学习vue-router

    摘要:路由模块的本质就是建立起和页面之间的映射关系。这时候我们可以直接利用传值了使用来匹配路由,然后通过来传递参数跳转对应路由配置于是我们可以获取参数六配置子路由二级路由实际生活中的应用界面,通常由多层嵌套的组件组合而成。 一、前言 要学习vue-router就要先知道这里的路由是什么?为什么我们不能像原来一样直接用标签编写链接哪?vue-router如何使用?常见路由操作有哪些?等等这些问...

    frontoldman 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<