要做类似 https://github.com/jgallen23/routie 的功能,单页app
就是需要处理前进后退和view的route[需要兼容ie6]
http://millermedeiros.github.io/crossroads.js/
https://github.com/asual/jquery-address
https://github.com/cowboy/jquery-bbq 好久没更新了
https://github.com/browserstate/history.js 好复杂的感觉
记得几年前自己做的一个项目是监听hash来实现的,现在再次遇到这个需求
找了一下,发现还是之前的库[crossroads,bbq],history.js居然 2000多行还不支持Opera 11 ,Mercury iOS
想问大家推荐一些好用的route的思路,以及为啥一个前端url监听搞的这么复杂,这么多年过去了居然没有相对清晰好用的方案
难道非要逼我抄一个 https://github.com/RubyLouvre/mmRouter/ 吗
[每次遇到这样的解决方案问题,发现司徒大的东西还是很实用滴~~]
还不快来试试我的?
Q.js 是一个炒鸡轻量的前端单页路由框架。
https://github.com/itorr/q.js
为了更好的利用缓存以及更少的后端支援,Q.js放弃了 HTML5 State,通过#!格式的 url hach 重现了 url 路由功能。
834byte
window.Q
万物之
死始我们先来一段简单的 Hello World
打开例子后,浏览器会从
http://simple.com/
跳转到http://simple.com/#!home
,并且在页面显示 Hallo World。如此,您的第一个通过
Q.js
实现的 URL 路由就工作了~接着我们再详细说明下,如何让
Q.js
工作的。注册URL
在
Q.js
中,提供 关键字 和 正则表达式 两种注册 URL 方式。关键字注册 URL 在
Q.js
中效率最高、但需要按照关键字模式规划 URL,在前者不能满足需求情况下可以使用正则注册法~接下来我们通过规划一个 blog 的URL,来学习如何使用
Q.js
注册URL。首页
我们先从首页开始~
在注册之前我们分析一下注册首页 URL 都有哪些需求:
1. 首先首页有一个固定格式
2. 在大部分情况下不需要在 URL 中体现参数传递
3. 是打开域名时的默认展示页
首先我们通过注册一个固定页面
home
,回调不期待传值通过以上代码 访问
#!home
时,就会触发后面的回调。在回调中我们修改页面 DOM 实现页面无刷新变换内容。
(这部分不在本篇文档所述范畴)
按照这样的方法,同理 我们也可以实现 类似 关于
#!about
、友情链接#!friend
等等页面的注册。实现了首页的 URL 注册之后,我们要在打开网页时默认跳转到
home
页。Q.js
的启动,由Q.init
函数实现。=在 init 的启动参数里面附带 index 参数,这样我们访问页面时就会默认打开
#!home
如果觉得
#!home
中的!
不符合预期,这…也是可以改的~可以通过任意符合 URI 规范的字符串分割,甚至也可以设置为空。
文章页和翻页
文章页和首页不太一样、只有URL的一部分是相同的,需要通过URL中的不同部分区分不同文章页,不是默认打开页。
Q.js
关键字模式时,参数之间通过/
分割,请根据顺序进行 URL 规划注册之后访问页面
#!article/123
即可触发article
页面回调,并传入 参数1"123"
翻页可文章页传值方式基本一致,在这里不重述
分类页
分类页其实和文章页很相似、只是参数一变成了分类名称,内容较多时需要传递下当前页码
依据上面的要求,我们依旧使用关键字注册模式,注册一个名为
category
的 url 预设两个参数 分类唯一名称cstr
,页码page
访问
#!category/photo
会传入photo
到category
的回调函数访问
#!category/photo/2
会传入photo
和2
到category
的回调函数参数二不存在时,需要在回调函数内进行处理~
导航条
有了这些 URL 之后,我们还需要一个导航条来提供页面之间的入口,
导航条需要在每次页面变更时修改导航条样式,指示当前打开的页面。
我们的 HTML 一般是这样的
CSS 一般是这样的
这时候我们需要在每次 URL 变更时,通过 JavaScript 动态修改 nav 中的
active
class
的位置,以修改样式。Q.js
提供了Q.pop
事件,可以通过注册Q.pop
实现在每次 URL 变更时发生回调,Q.pop
事件和其他 URL 事件不发生冲突,并在其他 URL 回调函数之前运行,请注意触发时机。注册和修改
Q.pop
有多种途径。可以放在启动函数中注册,比如:也可以通过 关键字注册
甚至可以直接修改
Q.pop
请注意,使用
Q.js
请避免使用Q.js
保留关键字为 URL 地址保留关键字包括:
reg
,pop
,go
,V
到这里,我们的简单的博客差不多就能用啦~
但是如果我们依旧想用保留关键字,用正则注册法是这样实现的
正则注册法需要在正则里指定可能传入的值
以上我们的博客URL规划基本就已经完成啦~
如何实现更加丰富的 url 格式
关键字注册法虽然方便,但仅仅支持 关键字/参数1/参数2/参数3 这种格式,想要实现更多不科学的 URL 格式,可以通过正则注册法~
比如视频网站的链接,由v开头后面跟数字ID的情况,预期必然会有参数一 并且为数字
这样访问
http://simple.com/#!v1234567
就会传递值1234567
给回调函数。我想在 JavaScript 里知道当前在哪个页面如何实现?
访问
Q.lash
变量即可返回当前页面关键字如何通过JavaScript跳转到特定链接
因为在
Q.js
中!关键字是可以被修改的,如果通过JavaScript实现URL跳转,可以调用q.go
函数当然,大部分情况我们推荐使用 HTML 原生的 a 标签 link 通过访客触发,进行跳转
以上。