director.js实现前端路由使用实例


Posted in Javascript onFebruary 03, 2015

做过后端开发,尤其是使用过类似Django或者express对服务器端的路由功能应该都比较熟悉,国外流行的博客系统wordpress也是非常经典的路由实现案例。那么,究竟什么的路由呢,下面通过wordpress来简单讲一下。

理解wordpress重写规则的的都是知道,实际上任何一条url的访问都是基于wordpress安装目录下的index.php(除了服务器上已经存在文件的访问),当wordpress的固定链接是模式设置是会很明显,例如文章的url是index.php?p=id,分类页面的url是index.php?cat=id。

在这里,index.php就充当了路由器的功能,请看下图:

director.js实现前端路由使用实例

也就是说,不管你访问的是什么地址,所有的请求最终都会重定向到index.php,程序会根据访问url的特征,确定你需要的是哪个类型的页面,然后向数据库作出查询,最终把html内容返回给浏览器。

上面说的是web后端路由,那么前端的路由是什么呢?实际上现在前端路由技术应用非常广泛,有很多开源的js类库都支持前端路由,如angularJS,ember.js, director.js等等。前端路由和后端路由原理一样,是让所有的交互和展现在一个页面运行以达到减少服务器请求,提高客户体验的目的,越来越多的网站特别是web应用都用到了前端路由。

director.js是最纯粹的路由注册/解析器,它在不刷新页面的情况下,利用“#”符号组织不同的URL路径,并根据不同的URL路径来匹配不同的回调方法。director.js不仅可以应用在客户端,在使用node.js的后台,它也能够实现前面说的后端路由功能。来看下面关于前端路由实现的例子
需要设计一下类似web QQ上的web桌面应用,桌面上有很多小图标,每一个小图标是一个功能应用,类似电脑桌面。桌面上有一个百度新闻的按钮,点击它在当前页面弹出一个窗口,能够查看百度新闻,另外一个图标,点击可以查看当前时间,下面是一个简单的示例:

<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="https://rawgit.com/flatiron/director/master/build/director.min.js"></script>
<style>
 * {margin:0;padding:0}
 body {width:100%;height:100%;background:#3d72b8}
 #baidunews {width:40px;height:40px;background:url("./du.png") no-repeat;display:block;margin:50px;}
 #tweibo {width:40px;height:40px;background:url("./du.png") no-repeat;display:block;margin:50px;}
</style>
</head>
<body>
 <a href="#/baidunews" id="baidunews" title="百度新闻"></a>
 <a href="#/time" id="tweibo" title="当前时间"></a>
<script>
 //定义路由
 var route = {
 "/time":nowtime,
 "/baidunews":[showframe,getbaidunew]
 }
 
 //初始化路由
 var router = Router(route)
 router.init();
 //定义显示当前时间的回调函数
 function nowtime(){
 var now=new Date();
 var y=now.getFullYear();
 var m=now.getMonth()+1;
 var d=now.getDate();
 var h=now.getHours();
 var mi=now.getMinutes();
 var s=now.getSeconds();
 alert("现在时间\n"+y+"年"+m+"月"+d+"日 "+h+"时"+mi+"分"+s+"秒");
 
 }
 //定义显示浏览器框架的函数
 function showframe(){
 var f=document.createElement("div");
 f.style.width="985px";
 f.style.height="500px";
 f.style.position="absolute";
 f.style.top="50px";
 f.style.left="200px";
 f.style.background="white";
 f.style.border="2px solid #ccc";
 //关闭按钮
 var close=document.createElement("span");
 close.style.position="absolute";
 close.style.right="5px";
 close.style.cursor="pointer";
 close.style.marginRight="5px";
 close.onclick=function(){
  document.body.removeChild(f);
 }
 close.innerHTML="X";
 //加载站外的iframe
 var win=document.createElement("iframe");
 win.id="myiframe";
 win.frameBorder=0;
 win.style.width="100%";
 win.style.height="100%";
 f.appendChild(close);
 f.appendChild(win);
 document.body.appendChild(f);
 }
 //定义加载百度新闻网页的函数
 function getbaidunew(){
 document.getElementById("myiframe").src="http://news.baidu.com/";
 }
</script>
</body>
</html>

从上面的代码可以看出,director.js利用页面中的“#”进行路由转发。上面的例子只是一个非常简单的实例,director.js能够实现更加复杂、庞大的功能,它可以通过ajax和服务端数据交互,可以和其它js类库并存,是一个web应用开发利器。

director.js对SEO有影响吗?

客户端的director.js对SEO有影响,因为数据所有数据只在一个页面,有些数据的存储方式不利于搜索引擎蜘蛛的抓取,如果你需要对SEO友好,说明你需要构造的是一个”web页面”而不是“web应用”,不推荐使用director.js。

参考资料:director.js

Javascript 相关文章推荐
Javascript 文件夹选择框的两种解决方案
Jul 01 Javascript
javascript 实现字符串反转的三种方法
Nov 23 Javascript
三种动态加载js的jquery实例代码另附去除js方法
Apr 30 Javascript
js实现点击图片将图片地址复制到粘贴板的方法
Feb 16 Javascript
js实现类似jquery里animate动画效果的方法
Apr 10 Javascript
javascript 应用小技巧方法汇总
Jul 05 Javascript
Spring MVC中Ajax实现二级联动的简单实例
Jul 06 Javascript
Bootstrap Modal遮罩弹出层代码分享
Nov 21 Javascript
js使用Replace结合正则替换重复出现的字符串功能示例
Dec 27 Javascript
深入理解javascript的getTime()方法
Feb 16 Javascript
解决vue.js在编写过程中出现空格不规范报错的问题
Sep 20 Javascript
Vue 中获取当前时间并实时刷新的实现代码
May 12 Javascript
js与jquery回车提交的方法
Feb 03 #Javascript
JS实现至少包含字母、大小写数字、字符的密码等级的两种方法
Feb 03 #Javascript
Javascript中call和apply函数的比较和使用实例
Feb 03 #Javascript
基于javascript、ajax、memcache和PHP实现的简易在线聊天室
Feb 03 #Javascript
jQuery内部原理和实现方式浅析
Feb 03 #Javascript
jQuery中extend函数的实现原理详解
Feb 03 #Javascript
jQuery中noconflict函数的实现原理分解
Feb 03 #Javascript
You might like
浅析虚拟主机服务器php fsockopen函数被禁用的解决办法
2013/08/07 PHP
form自动提交实例讲解
2017/07/10 PHP
laravel框架分组控制器和分组路由实现方法示例
2020/01/25 PHP
层序遍历在ExtJs的TreePanel中的应用
2009/10/16 Javascript
jquery 关键字“拖曳搜索”之“拖曳”以及 图片“提示自适应放大”效果 的实现
2010/04/18 Javascript
javascript 全等号运算符使用说明
2010/05/31 Javascript
High Performance JavaScript(高性能JavaScript)读书笔记分析
2011/05/05 Javascript
JS动态添加与删除select中的Option对象(示例代码)
2013/12/25 Javascript
Bootstrap每天必学之前端开发框架
2015/11/19 Javascript
javascript日期格式化方法小结
2015/12/17 Javascript
Highcharts入门之基本属性
2016/08/02 Javascript
微信小程序 加载 app-service.js 错误解决方法
2016/10/12 Javascript
scroll事件实现监控滚动条并分页显示(zepto.js)
2016/12/18 Javascript
jQuery动态产生select option下拉列表
2017/03/15 Javascript
vue组件父子间通信详解(三)
2017/11/07 Javascript
原生JS封装_new函数实现new关键字的功能
2018/08/12 Javascript
JS实现简单的抽奖转盘效果示例
2019/02/16 Javascript
Windows中安装使用Virtualenv来创建独立Python环境
2016/05/31 Python
使用python实现生成用户信息
2017/03/20 Python
详解python里使用正则表达式的分组命名方式
2017/10/24 Python
Tensorflow之Saver的用法详解
2018/04/23 Python
儿童编程python入门
2018/05/08 Python
PyCharm+Qt Designer+PyUIC安装配置教程详解
2019/06/13 Python
详解python日志输出使用配置文件格式
2021/02/10 Python
CSS3 mask 遮罩的具体使用方法
2017/11/03 HTML / CSS
美国最大的香水连锁店官网:Perfumania
2016/08/15 全球购物
英国领先的汽车轮胎和快速健康中心:Kwik Fit
2017/10/29 全球购物
历史专业个人求职信分享
2013/12/20 职场文书
单位门卫岗位职责
2013/12/20 职场文书
年级组长自我鉴定
2014/02/22 职场文书
工商管理自荐书
2014/07/06 职场文书
社区安全温馨提示语
2015/07/14 职场文书
获奖感言范文
2015/07/31 职场文书
2016领导干部廉洁自律心得体会
2016/01/13 职场文书
导游词之岳阳楼
2019/09/25 职场文书
MySQL连接查询你真的学会了吗?
2021/06/02 MySQL