很久没有认真的看过别人的代码了,今天在无忧脚本看到一个很有意思的脚本,纯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+'秒'
}即通过除法和求余的方式来计算,这样可能更好理解一些,但作者的写法将求余转为了/、*、-三个操作符的运算,这样的写法理解起来没有那么直观,但是可以使代码更加简洁。
网名:网者归来/yemoo,长期并将继续投身于WEB前端相关技术的学习和推广的大军中,目前就职于杭州,从事前端开发相关工作,有事可email/msn联系。