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对象的三个方法小结
Jan 12 Javascript
读jQuery之一(对象的组成)
Jun 11 Javascript
JS 加入收藏夹的代码(主流浏览器通用)
May 13 Javascript
JS获取下拉列表所选中的TEXT和Value的实现代码
Jan 11 Javascript
node.js学习总结之调式代码的方法
Jun 25 Javascript
js控制页面的全屏展示和退出全屏显示的方法
Mar 10 Javascript
AngularJS入门教程之数据绑定用法示例
Nov 01 Javascript
js初始化验证实例详解
Nov 26 Javascript
php简单数据库操作类的封装
Jun 08 Javascript
Javascript通过控制类名更改样式
May 24 Javascript
jquery实现下载图片功能
Jul 18 jQuery
Vue.js组件props数据验证实现详解
Oct 19 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 array_map array_multisort 高效处理多维数组排序
2009/06/11 PHP
PHP中限制IP段访问、禁止IP提交表单的代码
2011/04/23 PHP
php中require和require_once的区别说明
2014/02/27 PHP
[原创]解决wincache不支持64位PHP5.5/5.6的问题(提供64位wincache下载)
2016/06/22 PHP
PHP中的多种加密技术及代码示例解析
2016/10/20 PHP
动态改变textbox的宽高的js
2006/10/26 Javascript
JS打开图片另存为对话框实现代码
2012/12/26 Javascript
JS声明变量背后的编译原理剖析
2012/12/28 Javascript
JS可以控制样式的名称写法一览
2014/01/16 Javascript
JS函数this的用法实例分析
2015/02/05 Javascript
javascript简单实现滑动菜单效果的方法
2015/07/27 Javascript
JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同
2015/11/15 Javascript
jQuery实现点击行选中或取消CheckBox的方法
2016/08/01 Javascript
js实现简单的碰壁反弹效果
2016/08/30 Javascript
JavaScript实现向select下拉框中添加和删除元素的方法
2017/03/07 Javascript
详解vue.js+UEditor集成 [前后端分离项目]
2017/07/07 Javascript
浅谈函数调用的不同方式,以及this的指向
2017/09/17 Javascript
jQuery EasyUI window窗口使用实例代码
2017/12/25 jQuery
vue2单元测试环境搭建
2018/05/24 Javascript
VUE2.0+ElementUI2.0表格el-table实现表头扩展el-tooltip
2018/11/30 Javascript
python 类详解及简单实例
2017/03/24 Python
Python利用QQ邮箱发送邮件的实现方法(分享)
2017/06/09 Python
Django之Mode的外键自关联和引用未定义的Model方法
2018/12/15 Python
opencv转换颜色空间更改图片背景
2019/08/20 Python
浅谈matplotlib.pyplot与axes的关系
2020/03/06 Python
Crocs卡骆驰洞洞鞋日本官方网站:Crocs日本
2016/08/25 全球购物
迪卡侬荷兰官网:Decathlon荷兰
2017/10/29 全球购物
制药工程专业毕业生推荐信
2013/12/24 职场文书
cf收人广告词
2014/03/14 职场文书
2014年房地产工作总结范文
2014/11/19 职场文书
九华山导游词
2015/02/03 职场文书
2016大学生诚信考试承诺书
2016/03/25 职场文书
创业计划书之水果店
2019/07/18 职场文书
python基础之错误和异常处理
2021/10/24 Python
前端JavaScript大管家 package.json
2021/11/02 Javascript
win10输入法不见了只能打出字母怎么解决?
2022/08/05 数码科技