本章将介绍如何使用avalon来实现前端路由功能。
我们需要用到两个avalon路由配套模块—— mmHistory.js 和 mmRouter.js 。其中mmHistory是用于历史管理,它会劫持页面上所有点击链接的行为,当这些链接是以 #/ 、 #!/ 开头,就尝试匹配路由规则,阻止页面刷新 (通过hash方式或HTML5的replaceState方式) 。mmRouter是给我们定义路由规则,路由规则可以更精细地指定每个参数 (param) 的匹配规则,如果符合就执行对应的回调,如果不符合,就进入error回调。
关于该路由系统更具体的描述,可以查阅 这里 。
作为示例,我们打算制作一个网站的 “用户中心” 页面,其中左侧为导航列表,右侧为受左侧列表控制的内容显示区域:
该“用户中心”页面有这么几个要求:
⑴ 页面不跳转,仅做局部(即内容区域部分)刷新;
⑵ 可以通过不同的url进入对应的页面(即内容区域显示对应的内容);
⑶ 浏览器能记住url状态,比如从“账户详情”点入“我要充值”页面,然后再点击浏览器返回按钮,可以正确回到“账户详情”页面。
由于不是石器时代,自然不会再选择iframe这种内耗高、不友好的元素来架构页面(而且iframe也实现不了后面两个需求呀) 。那么我们会很快联想到Ajax技术,这个想法很本质,不过单纯的Ajax也没办法达到我们的要求,所以才需要引入开头提到的两个avalon路由模块。
我们可以先写出简单的页面原型:
index.html:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>账户中心</title> <link rel="stylesheet" href="css/user.css"> <script src="js/lib/require.js" type="text/javascript" data-main="js/page/user"></script> </head> <body ms-controller="user" class="ms-controller"> <script type="text/javascript"> //这里给后端提供数据接口 var conf = { username: {"id": "11", "name": "VaJoy"} } </script> <header> <span>{{username.name}}你好,欢迎来到账户中心</span> </header> <nav> <ul> <li><a href="#!/index">我的首页</a></li> <li><a href="#!/detail">账户详情</a></li> <li><a href="#!/recharge">我要充值</a></li> </ul> </nav> <article> 内容... </article> </body> </html>
user.js:
require.config({ baseUrl: 'js/lib/', paths:{ avalon: 'avalon', domReady:'domReady', mmHistory: 'mmHistory', mmRouter: 'mmRouter', jquery: 'jq' }, shim:{ avalon: { exports: "avalon" }, mmHistory:{ deps: ['avalon']}, mmRouter:{ deps: ['avalon']} } }); require(['avalon',"domReady!"], function() { var vm = avalon.define({ $id: "user", username:conf.username }); avalon.scan(); });
user.css:
body,html{padding: 0;margin:0;background: #EEE;} .ms-controller{visibility: hidden;} header{height: 50px;background: white;} header>span{display:block;padding: 16px;} nav{position: absolute;left:0;margin-top:50px;width: 200px;} nav>ul>li{margin-top: 12px;} nav>ul>li>a{text-decoration: none;color:blue;} nav>ul>li>a:hover{color:red;} article{padding: 15px;margin-left:200px;min-height: 600px;background: white;}
运行结果如下:
接着我们要新建三个页面——mine.html、detail.html 和 recharge.html ,分别对应“我的首页”、“账户详情” 和 “我要充值” 的右侧内容,咱在里面随便写点内容意思意思即可,比如mine.html我就写了一句话:
接着我们默认先把mine.html引入到index.html中,这里我们借助avalon的 ms-include-src 接口,修改下index.html:
<nav> <ul> <li><a href="#!/index">我的首页</a></li> <li><a href="#!/detail">账户详情</a></li> <li><a href="#!/recharge">我要充值</a></li> </ul> </nav> <article ms-include-src="pageUrl"> <!--这里使用ms-include-src接口,它会引入pageUrl属性所对应的文件--> </article>
接着修改 user.js的部分:
require(['avalon',"domReady!"], function() { var vm = avalon.define({ $id: "user", username:conf.username, pageUrl:"mine.html" //默认为mine.html }); avalon.scan(); });
运行如下:
接着是时候让 mmHistory.js 和 mmRouter.js 发挥它们的作用了,我们修改下user.js的部分代码:
require(['mmHistory','mmRouter',"domReady!"], function() { var vm = avalon.define({ $id: "user", username:conf.username, pageUrl:"mine.html" //默认为mine.html }); function callback() {if(this.path==="/index"){ vm.pageUrl="mine.html"; }else { var path_tail = this.path.replace(/\//, ""); vm.pageUrl = path_tail + ".html"; //动态修改pageUrl属性值 } } avalon.router.get("/*path", callback); //劫持url hash并触发回调 avalon.history.start(); //历史记录堆栈管理 avalon.scan(); });
注意由于在 require.config 的 shim 中我们已经定义了 mmHistory.js 和 mmRouter.js是依赖于avalon的,故此处无须再引入avalon模块,requireJS执行该代码段之前会先加载好avalon的。
我们通过这两行代码执行了路由和历史记录的管理:
avalon.router.get("/*path", callback); //劫持url hash并触发回调 avalon.history.start(); //历史记录堆栈管理
其中router.get() 的第一个参数表示路由匹配规则,比如这里的“/*path”表示匹配全部路径,匹配到了就触发回调callback函数。
更多的匹配规则我们可以直接在 mmRouter.js 中查看注释信息:
router.get() 在触发callback前会生成一个this.path对象供callback调用,其值为当前匹配到的路径,比如当url后缀变成 #!/recharge 的时候,this.path的值为匹配到的"/recharge" 。了解了这个之后,callback 函数也很好理解了:
function callback() {if(this.path==="/index"){ vm.pageUrl="mine.html"; //如果url后缀变成"#!/index",则pageUrl为“mine.html” }else { var path_tail = this.path.replace(/\//, ""); //去掉this.path值的第一个斜杠 vm.pageUrl = path_tail + ".html"; //动态修改pageUrl属性值 } }
这时候的运行结果如下所示:
自此便实现了我们的需求。但是这样还不够完美——每个页面的样式咋处理呢?
我们可以直接在页面上写<style>标签,或者直接写个<link>引入外部样式文件,但前者不好维护,后者毕竟不是插入到head中的不太规范。那么我们能否也用requireJS模块化动态引入样式文件呢?答案是肯定的,不过得借助于其组件 css.js 。
以“账户详情”(detail.html)为例,我们创建一个detail.css文件,里面设置 .detail{color:red;}。
先确保require.config中的paths里加上了该组件:
paths:{ //这里配置的地址,都是相对于上方的baseUrl的 avalon: 'avalon', domReady:'domReady', mmHistory: 'mmHistory', mmRouter: 'mmRouter', css: 'css' //加上css.js }
然后修改detail.html页面内容:
<section ms-controller="detail" class="detail ms-controller"> 哟哟哟,这里是详情页面,{{username.name}}你好 </section> <script> require(['avalon','css!../../css/detail.css'], function(){ //下面的其实建议写成一个模块detail.js然后由require引入 avalon.define({ $id: "detail", username: conf.username }); avalon.scan(); }) </script>
“css!/XXX.css” 是css.js的写法,注意以"css!"开头即可。
运行结果如下:
以上便是avalon前端路由的简单实现,本章的示例代码可以从 这里 下载。
后续章节可能会开始写一写avalon的API。共勉~
相关推荐
本章开始搭配requireJS来使用avalon,开始之前,我们可以对avalon进行精简改造(注:新版的avalon已提供了shim版本,无需再做如下的精简了,直接点这里获取)。avalon源码里有自己的AMD加载器和DOMReady模块,使用...
我们需要用到两个avalon路由配套模块——mmHistory.js 和mmRouter.js。...#/、#!...mmRouter是给我们定义路由规则,路由规则可以更精细地指定每个参数(param)的匹配规则,如果符合就执行对应的回调,如果不符合,就进入...
【标题】"提取色素的前端神器"所指的是一款用于前端设计的颜色提取工具,它能够帮助用户方便快捷地从屏幕上的任何位置获取颜色值,极大地提升了前端开发人员的工作效率。这款神器的操作简单易懂,无需复杂的设置或...
FSCapture,正如其标题所言,“前端神器”,是一款集截图、取色、屏幕尺子、放大镜等功能于一体的实用工具,为开发者提供了极大的便利。 **一、截图功能** FSCapture的截图功能强大且灵活,它支持多种截图模式,...
takecolor取色器是一款轻便小巧的屏幕色彩拾取小工具。takecolor取色器是目前为止使用感觉比较好的取色工具,可以直接使用快捷键“alt+C”就可以取色,方便快捷,可以针对电脑屏幕上任何位置的色彩进行自定义拾取,...
这个软件的好处就不说了。安装步骤就是直接下一步即可。
这款软件以其便捷性和实用性,被誉为“前端神器”。 一、截图功能 FSCapture的截图功能强大且灵活,支持多种截图模式,包括全屏截图、活动窗口截图、自定义区域截图等。开发者可以快速捕捉到屏幕上的任何元素,无论...
文件过大,已经上传到百度云盘中,压缩包中有汉化包破解钥匙安装包。 附带实用编辑器editplus同样有破解码在其中。http://pan.baidu.com/s/1gfclk6R。。。。。。。。。。。。。。。。。。。。。...
标题中的“前端动效告白女朋友神器,网页HTML”指的是一个使用前端技术制作的互动告白页面,通过HTML、CSS和JavaScript实现动态效果,旨在给女朋友带来惊喜。这个项目的核心在于利用网页的交互性来表达情感,使得...
《FSCapture:前端开发者的高效工具》 在IT行业中,尤其是前端开发领域,高效的工具是提高工作效率的关键。FSCapture就是这样一款强大的辅助工具,它集合了截图、取色、屏幕尺子和放大镜等多种功能,深受前端开发者...
【koala前端编译神器】 koala是一款专为前端开发者设计的强大工具,它以其轻巧高效的特点,成为了前端开发中的“编译神器”。koala主要的功能是自动化编译和实时刷新,大大提升了前端开发的效率。它支持LESS、SASS...
【FSCapture——前端开发者的高效工具】 在前端开发领域,高效的工具对于提升工作效率至关重要。FSCapture(FastStone Capture)就是这样一款强大的屏幕捕获与编辑软件,深受前端开发者喜爱。它不仅具备基本的截图...
微信小程序前端开发者工具是一款根据效果图像画画一样来设计微信小程序,自动生成导出前端页面的快速开发工具。可以很方便、快速地生成小程序的wxml,wcss,js文件。可以大大提高您的工作效率,减少前端布局的编写工作...
本人几乎从开始做前端到现在,几乎是天天用ws,用了大约5年多了,ws真不亏是前端神器,真心强大的不行,下面share一下个人的一些Tips,希望对别人有所帮助。 1. 修改 编辑器字体 File-> Settings -> Editor -> ...
Codekit - 又一华丽的工具,自动编译Less, Sass, Stylus, CoffeeScript, Jade & Haml等文件 致力于js文件合并和压缩,以及js语法错误检查 同时还支持Compass(Sass...相信对于Web前端攻城师来说,这些功能都是非常受用的
"前端截屏取色神器"是一款专为前端开发者和设计师设计的强大工具,它结合了屏幕截图和颜色选取功能,能够帮助用户快速、精准地获取屏幕上的颜色信息,并且提供了便捷的截图操作。这款神器的特性在于其“绿色版”属性...
**AngularJS前端开发神器:yeoman generator for Angularjs** AngularJS,由Google维护的一个开源JavaScript框架,被广泛用于构建高效、可维护的单页应用程序(SPA)。它通过提供丰富的指令和依赖注入机制,极大地...