Javascript实现前端单页面路由的方法

WEB开发中路由概念并不陌生,我们接触到的有前端路由和后端路由。后端路由在很多框架中是一个重要的模块,如Thinkphp,Wordpress中都应用了路由功能,它能够让请求的url地址变得更简洁。同样前端路由在单页面应用也很常见,它使得前端页面体验更流畅。


前端路由在很多开源的js类库框架中都得到支持,如angularJS,Backbone,Reactjs等等。前端路由和后端路由原理一样,是让所有的交互和展现在一个页面运行以达到减少服务器请求,提高客户体验的目的,越来越多的网站特别是web应用都用到了前端路由。



HTML

页面中有一个导航菜单ul,和一个div#result用来显示结果,当点击导航菜单时,#result中会显示不同的结果内容。

<ul>  
    <li><a href="#/">首页</a></li>  
    <li><a href="#/product">产品</a></li>  
    <li><a href="#/server">服务</a></li>  
</ul> 
<div id="result"></div>
<script src="./router.js"></script>

JAVASCRIPT

说一下前端路由实现的简要原理,以 hash 形式(也可以使用 History API 来处理)为例,当 url 的 hash 发生变化时,触发 hashchange 注册的回调,回调中去进行不同的操作,进行不同的内容的展示。

function Router(){ 
    this.routes = {}; 
    this.curUrl = ''; 
this.route = function(path, callback){ 
    this.routes[path] = callback || function(){}; 
}; 

this.refresh = function(){ 
    this.curUrl = location.hash.slice(1) || '/'; 
    this.routes[this.curUrl](); 
}; 

this.init = function(){ 
    window.addEventListener('load', this.refresh.bind(this), false); 
    window.addEventListener('hashchange', this.refresh.bind(this), false); 
} 

}

上面代码中路由系统Router对象实现,主要提供三个方法:

init 监听浏览器 url hash 更新事件。

route 存储路由更新时的回调到回调数组routes中,回调函数将负责对页面的更新。

refresh 执行当前url对应的回调函数,更新页面。

Router调用方式如下:点击触发 url 的 hash 改变,并对应地更新内容,运行后你会发现每次点击菜单时,#result中会变换背景色和内容。

var R = new Router(); 
R.init(); 
var res = document.getElementById('result'); 

R.route('/', function() {
res.style.background = 'blue';
res.innerHTML = '这是首页';
});
R.route('/product', function() {
res.style.background = 'orange';
res.innerHTML = '这是产品页';
});
R.route('/server', function() {
res.style.background = 'black';
res.innerHTML = '这是服务页';
});

以上为一个前端路由的简单实现,实际应用中,应该对hash进行正则匹配处理,以满足大量url的应用,同时增加ajax异步请求页面内容等功能。虽然这个实例非常简单,但实际上很多路由系统的根基都立于此,其他路由系统主要是对自身使用的框架机制进行配套及优化。


解决 php-cgi 启动时提示缺少 msvcr110.dll 的问题

问题描述:

启动 php-cgi 时如果提示缺少 msvcr110.dll

问题原因:

缺少 vc 2012 运行库
 
问题解决:
需要安装 vcredist_x64.exe 或 vcredist_x86.exe
 
下载地址:
http://www.microsoft.com/zh-cn/download/details.aspx?id=30679
 
---------------------------------------------------------------------------------------------------
http://windows.php.net/download/
打开这个链接, 我们看到一系列的下载地址, 以下是一一解释:
VC11 x86 Non Thread Safe (vc11 非线程安全)
VC11 x86 Thread Safe (vc11 线程安全)
VC9 x86 Non Thread Safe
VC9 x86 Thread Safe
VC6 x86 Non Thread Safe

注意看左侧的说明. VC9 and VC11, 
Visual Studio 2005 是vc6.
Visual Studio 2008 是vc9.
Visual Studio 2010 是vc10
Visual Studio 2012 是vc11
以此类推, 如果需要使用php 5.5.0 VC11 x86 Non Thread Safe 那么肯定需要安装vc11

目前vc11已经释放出update 3的安装包, 可以完美兼容php 5.5.0

解决php5.6的curl扩展开启失败的问题

最近在一个项目中需要用到php下的curl扩展,但是在实际运行时遭遇到了curl函数无法执行的问题,页面错误为:

Call to undefined function curl_init();

按照常规步骤检查

  1. 用phpinfo()找到php.ini文件路径
  2. extension_dir是否配置正确
  3. extension=php_curl.dll是否打开

结果一切正常,但是phpinfo()的结果里没有curl模块。将php.ini中的;extension=php_curl.dll的注释去掉后,重启apache后仍然报Call to undefined function curl_init()的错误。百度多次,尝试很多方法,也不能成功的将curl成功开启。

解决方法

最后在官方说明文档中的http://php.NET/manual/zh/curl.installation.php这个页面得到了提示,只要将php安装目录下的libssh2.dll复制到apache的bin目录,并重新启动apache,于是乎curl成功开启。
注意:我的刚开始已经完成上述步骤,但是是在windows命令行工具下用的httpd -k restart重启的apache,结果仍然报Call to undefined function curl_init()的错误。之后无意中在windows服务窗口中右键apache服务,重启后成功。

测试环境

- 阅读剩余部分 -

PHP non-thread-safe和thread-safe这两个版本的区别

1.non-thread-safe 
非线程安全 下载文件中带有 NTS 与IIS 搭配环境使用
2.thread-safe  
线程安全  与apache 搭配的环境使用

php还有 VC6 VC9版本 区分,VC6支持apache,VC9支持IIS ,VC9 用在apache上也没问题。

PHP常用函数总结

PHP的一些常用函数

usleep() 函数延迟代码执行若干微秒。
unpack() 函数从二进制字符串对数据进行解包。
uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID。
time_sleep_until() 函数延迟代码执行直到指定的时间。
time_nanosleep() 函数延迟代码执行若干秒和纳秒。
sleep() 函数延迟代码执行若干秒。
show_source() 函数对文件进行语法高亮显示。
strip_whitespace() 函数返回已删除 PHP 注释以及空白字符的源代码文件。
pack() 函数把数据装入一个二进制字符串。
ignore_user_abort() 函数设置与客户机断开是否会终止脚本的执行。
highlight_string() 函数对字符串进行语法高亮显示。
highlight_file() 函数对文件进行语法高亮显示。
get_browser() 函数返回用户浏览器的性能。
exit() 函数输出一条消息,并退出当前脚本。
eval() 函数把字符串按照 PHP 代码来计算。
die() 函数输出一条消息,并退出当前脚本。
defined() 函数检查某常量是否存在。
define() 函数定义一个常量。
constant() 函数返回常量的值。
connection_status() 函数返回当前的连接状态。
connection_aborted() 函数检查是否断开客户机。
zip_read() 函数读取打开的 zip 档案中的下一个文件。
zip_open() 函数打开 ZIP 文件以供读取。
zip_entry_read() 函数从打开的 zip 档案项目中获取内容。
zip_entry_open() 函数打开一个 ZIP 档案项目以供读取。
zip_entry_name() 函数返回 zip 档案项目的名称。
zip_entry_filesize() 函数返回 zip 档案项目的原始大小(在压缩之前)。
zip_entry_compressionmethod() 函数返回 zip 档案项目的压缩方法。
zip_entry_compressedsize() 函数返回 zip 档案项目的压缩文件尺寸。
zip_entry_close() 函数关闭由 zip_entry_open() 函数打开的 zip 档案文件。

zip_close() 函数关闭由 zip_open() 函数打开的 zip 档案文件。

- 阅读剩余部分 -

URL中“#” “?” &“”号的作用

1. #

    10年9月,twitter改版。一个显著变化,就是URL加入了"#!"符号。比如,改版前的用户主页网址为http://twitter.com/username改版后,就变成了http://twitter.com/#!/username
这是主流网站第一次将"#"大规模用于重要URL中。这表明井号(Hash)的作用正在被重新认识。本文根据HttpWatch的文章,整理与井号有关的所有重要知识点。


一、#的涵义
#代表网页中的一个位置。其右面的字符,就是该位置的标识符。比如,http://www.example.com/index.html#print就代表网页index.html的print位置。浏览器读取这个URL后,会自动将print位置滚动至可视区域。
为网页位置指定标识符,有两个方法。一是使用锚点,比如<a name="print"></a>,二是使用id属性,比如<div id="print">。

- 阅读剩余部分 -

Javascript获取URL参数值和当前页面URL信息

在开发中我们通常会遇到需求需要获取当前URL的参数信息和URL等信息,这时候需要配合javascript系统的方法和正则表达式来实现代码,


1.获取URL参数值方法

function GetRequest() {
    var url = location.search; //获取url中"?"符后的字串
    var theRequest = new Object();
    if (url.indexOf("?") != -1) {
        var str = url.substr(1);
        if (str.indexOf("&") != -1) {
            strs = str.split("&");
            for (var i = 0; i < strs.length; i++) {
                theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);
            }
        } else {
            theRequest[str.split("=")[0]] = unescape(str.split("=")[1]);
        }
    }
    return theRequest;
}

- 阅读剩余部分 -

php获取当前时间戳方法

1、获取当前时间方法date()

很简单,这就是获取时间的方法,格式为:date($format, $timestamp),format为格式、timestamp为时间戳--可填参数。
2、获取时间戳方法time()、strtotime()
这两个方法,都可以获取php中unix时间戳,time()为直接获取得到,strtotime($time, $now)为将时间格式转为时间戳,$time为必填。清楚了这个,想了解更多,请继续往下看。

- 阅读剩余部分 -