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 设计模式 推荐
Oct 28 Javascript
jQuery实现将页面上HTML标签换成另外标签的方法
Jun 09 Javascript
jQuery validate验证插件使用详解
May 11 Javascript
深入理解js中this的用法
May 28 Javascript
使用bootstrapValidator插件进行动态添加表单元素并校验
Sep 28 Javascript
vue-router命名路由和编程式路由传参讲解
Jan 19 Javascript
bootstrap datepicker的基本使用教程
Jul 09 Javascript
layui表单提交到后台自动封装到实体类的方法
Sep 12 Javascript
关于在LayUI中使用AJAX提交巨坑记录
Oct 25 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
Jan 16 Javascript
vue实现分页的三种效果
Jun 23 Javascript
JS前端使用canvas实现物体的点选示例
Aug 05 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/10/03 PHP
PHP 类型转换函数intval
2009/06/20 PHP
php获取远程图片体积大小的实例
2013/11/12 PHP
PHP计算一年多少个星期和每周的开始和结束日期
2014/07/01 PHP
php中session_id()函数详细介绍,会话id生成过程及session id长度
2015/09/23 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
2015/12/10 PHP
PHP实现的统计数据功能详解
2016/12/06 PHP
数据结构之利用PHP实现二分搜索树
2020/10/25 PHP
实现JavaScript中继承的三种方式
2009/10/16 Javascript
jQuery选择器的工作原理和优化分析
2011/07/25 Javascript
ie下$.getJSON出现问题的解决方法
2014/02/12 Javascript
jQuery实现图片渐入渐出切换展示效果
2015/08/15 Javascript
bootstrap 弹出框modal添加垂直方向滚轴效果
2018/07/09 Javascript
SVG实现时钟效果
2018/07/17 Javascript
webpack之引入图片的实现及问题
2018/10/08 Javascript
Vue中JS动画与Velocity.js的结合使用
2019/02/13 Javascript
[05:26]2014DOTA2西雅图国际邀请赛 iG战队巡礼
2014/07/07 DOTA
Flask框架的学习指南之用户登录管理
2016/11/20 Python
python模块简介之有序字典(OrderedDict)
2016/12/01 Python
Python使用中文正则表达式匹配指定中文字符串的方法示例
2017/01/20 Python
python实现unicode转中文及转换默认编码的方法
2017/04/29 Python
python实现旋转和水平翻转的方法
2018/10/25 Python
django日志默认打印request请求信息的方法示例
2020/05/17 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
2020/07/09 Python
Django实现文章详情页面跳转代码实例
2020/09/16 Python
解决html5中的video标签ios系统中无法播放使用的问题
2020/08/10 HTML / CSS
医务人员竞聘职务自我评价分享
2013/11/08 职场文书
《雪儿》教学反思
2014/04/17 职场文书
3的组成教学反思
2014/04/30 职场文书
青年志愿者先进事迹
2014/05/06 职场文书
合同意向书范本
2014/07/30 职场文书
贷款担保书
2015/01/20 职场文书
员工自我评价范文
2015/03/11 职场文书
道歉的话语大全
2015/05/12 职场文书
2016入党积极分子党课培训心得体会
2016/01/06 职场文书
MySQL系列之七 MySQL存储引擎
2021/07/02 MySQL