AJAXBBS.NET   yemoo's blog

专注WEB前端及RIA技术 -- XHTML/CSS/JavaScript/Ajax/RIA

导航

« FLex的一些学习资源(不断更新中...)JS数组克隆的几种方式 »

“纯JS的基于静态站点服务器时间”代码学习

很久没有认真的看过别人的代码了,今天在无忧脚本看到一个很有意思的脚本,纯JS的基于静态站点服务器时间 [无依赖] 的倒计时程序(Ajax应用)(大家也可以看我这里的演示),大概看了一下代码,发现作者的js水平还是很牛的,程序代码精炼,其风格是我所喜欢的(虽然很多人都批评这种代码风格),代理中也有很多值得我去学习的地方。

这里简单总结一下(声明:本人水平欠缺,这里有些写法也许对你来说已经是司空见惯了,请不要鄙视俺):

1、
if(document.all){
    window.XMLHttpRequest=function(){
        var $=['Microsoft.XMLHTTP','Msxml2.XMLHTTP'];
		for(var i=0;i<$.length;i++){try{return new ActiveXObject($[i])}catch(e){}};
    };
}

这里写法倒是也没有什么难理解,只是采用为IE增加XMLHttpRequest这个与其他浏览器兼容的全局变量的写法,本人很喜欢,貌似某个Js-Lib也是这么做的。这样在其他浏览器下实际上节省一个对xmlhttp对象引用的变量。

2、
webDate=function(fn){
       var QQ=new XMLHttpRequest();
       QQ.onreadystatechange=function(){QQ.readyState==4&&(fn(new Date(QQ.getResponseHeader('Date'))))};
       QQ.open('HEAD', '/?_='+(-new Date));
       QQ.send(null);
}

这段代码主要值得注意的是QQ.open('HEAD', '/?_='+(-new Date));这部分,初次看到这行代码时那两个参数让我怔了一下。对于ajax的使用对于我来说也不算生疏了,但是请求方法为HEAD倒是没有见过,查了一下XMLHTTP对象的方法,发现请求方法只包括:POST、GET、PUT及PROPFIND四种,看来作者这个HEAD只是随便写了一个,我换成GET/POST测试结果一样。

第二个参数是URL,在根目录下跟了"?_="+(-new Date)这个,其目录应该是防止ajax缓存,以确保每次都请求到最新的数据,这里参数名就是“_”这个了,参数值为(-new Date),为什么要加一个负号?转换成数值? 后来自己测试才发现对于new Date对象,转换字符串(new String(new Date))的结果是类似于“Mon Dec 15 19:16:37 UTC+0800 2008”这种格式的,如果转换为Number(new Number(new Date))则是以毫秒的形式显示。以前偶取毫秒都是通过getTime方法获取的,这次算是又学了一招,通过new Number(new Date)或者通过运算符“-”转换成数字(-new Date)。

3、
time2String=function (t){
with(t)return [getFullYear(),'年'
,('0'+getMonth()+2).slice(-2),'月'
,('0'+getDate()).slice(-2),'日 '
,('0'+getHours()).slice(-2),': '
,('0'+getMinutes()).slice(-2),': '
,('0'+getSeconds()).slice(-2)].join('')
}

这里值得学习的还是作者的一种精炼程序的写法,通过slice来格式化日期。

在返回时间时一般我们是希望显示两位数字,如果是一位则前面补零,常见做法为:var h=d.getHours();h=h>9?h:'0'+h;。但明显作者的做法更加简单,通过slice(-2)来取最后两位字符来实现,这里很妙。

4、
int2time=function (m){
	m-=(D=parseInt(m/86400000))*86400000;
	m-=(H=parseInt(m/3600000))*3600000;
	S=parseInt((m-=(M=parseInt(m/60000))*60000)/1000);
	return D+'天'+H+'小时'+M+'分'+S+'秒'
}

这里的时间转换中作者的写法也是相当的精炼。一般本人的写法为:

int2time1=function (m){
	D=parseInt(m/86400000);
	m=m%86400000;
	H=parseInt(m/3600000);
	m=m%3600000;
	M=parseInt(m/6000);
	m=m%6000;
	D=parseInt(m/1000);
	return D+'天'+H+'小时'+M+'分'+S+'秒'
}

即通过除法和求余的方式来计算,这样可能更好理解一些,但作者的写法将求余转为了/、*、-三个操作符的运算,这样的写法理解起来没有那么直观,但是可以使代码更加简洁。

Share

  • 相关文章:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

About ME

  • 网名:网者归来/yemoo,长期并将继续投身于WEB前端相关技术的学习和推广的大军中,目前就职于杭州,从事前端开发相关工作,有事可email/msn联系。
  • Email:netman8410#163.com
    MSN:yanwei8410#hotmail.com
    PS:牛B都是从傻B变来的

Search

网站分类

最近发表

最新评论及回复

文章归档

Powered By Z-Blog 1.8 Arwen Build 90619  豫ICP备06015770号

Copyright 2006-2009 AJAXBBS.NET. All Rights Reserved.