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 &amp;&amp;和||运算法的另类使用技巧
Nov 28 Javascript
使用JavaScript库还是自己写代码?
Jan 28 Javascript
js两行代码按指定格式输出日期时间
Oct 21 Javascript
js去空格技巧分别去字符串前后、左右空格
Oct 21 Javascript
Jquery的each里用return true或false代替break或continue
May 21 Javascript
在Linux上用forever实现Node.js项目自启动
Jul 09 Javascript
使用Meteor配合Node.js编写实时聊天应用的范例
Jun 23 Javascript
Angular ng-repeat指令实例以及扩展部分
Dec 26 Javascript
bootstrapValidator.min.js表单验证插件
Feb 09 Javascript
js异步编程小技巧详解
Aug 14 Javascript
在SSM框架下用laypage和ajax实现分页和数据交互的方法
Sep 27 Javascript
JavaScript实现字符串与HTML格式相互转换
Mar 17 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面向对象的方法重载两种版本比较
2008/09/08 PHP
php Undefined index的问题
2009/06/01 PHP
php从给定url获取文件扩展名的方法
2015/03/14 PHP
php基于双向循环队列实现历史记录的前进后退等功能
2015/08/08 PHP
PHP框架自动加载类文件原理详解
2017/06/06 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
2019/05/27 PHP
获取网站跟路径的javascript代码(站点及虚拟目录)
2009/10/20 Javascript
JavaScript浏览器选项卡效果
2010/08/25 Javascript
关于onScroll事件在IE6下每次滚动触发三次bug说明
2011/09/21 Javascript
jQuery+CSS实现简单切换菜单示例
2016/07/27 Javascript
JavaScript Uploadify文件上传实例
2017/02/28 Javascript
jquery获取select,option所有的value和text的实例
2017/03/06 Javascript
Node.js+ES6+dropload.js实现移动端下拉加载实例
2017/06/01 Javascript
JavaScript 异步调用
2017/10/25 Javascript
Express本地测试HTTPS的示例代码
2018/06/06 Javascript
如何自动化部署项目?折腾服务器之旅~
2019/04/16 Javascript
JavaScript实现简易聊天对话框(加滚动条)
2020/02/10 Javascript
JavaScript this指向相关原理及实例解析
2020/07/10 Javascript
探索Python3.4中新引入的asyncio模块
2015/04/08 Python
Django框架序列化与反序列化操作详解
2019/11/01 Python
pytorch 彩色图像转灰度图像实例
2020/01/13 Python
python爬取本站电子书信息并入库的实现代码
2020/01/20 Python
Python短信轰炸的代码
2020/03/25 Python
python中pandas库中DataFrame对行和列的操作使用方法示例
2020/06/14 Python
详解Python yaml模块
2020/09/23 Python
HTML最新标准HTML5总结(必看)
2016/06/13 HTML / CSS
canvas绘制图片drawImage使用方法
2020/09/15 HTML / CSS
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
公司年会演讲稿范文
2014/01/11 职场文书
优秀教师先进事迹
2014/01/22 职场文书
乌鸦喝水教学反思
2014/02/07 职场文书
小学生开学第一课活动方案
2014/03/27 职场文书
《宿建德江》教学反思
2014/04/23 职场文书
大学生考试作弊被抓检讨书
2014/12/27 职场文书
基层党建工作简报
2015/07/21 职场文书
redis实现排行榜功能
2021/05/24 Redis