在實際的業務邏輯中,經常是與時間相關的,而前端能獲得的時間有兩個:客戶端的時間,服務器的時間.
客戶端時間通過 javascript中的Date對象可以獲取,如
- var dt = new Date();
- var tm = dt.getTime();
那么tm就是客戶端的時間,另外也可以通過對應的getFullYear(),getMonth(),getDate()取到對應的年月日等...
但這個時間可靠嗎?
好吧,那取服務器時間吧
經常用到的是后台寫一個php,jsp,cgi,asp...通過這些程序來返回一個時間,這是一種解決方案,但僅僅一個時間點,有必要用程序后台程序來實現嗎?
那還有什么解決方案嗎?
PS:在生成頁面的時候把服務器時間就寫在里邊,然后就可以直接用了.但如果只是一個靜態頁面了呢,能這么干嗎?
好吧,我在這里提出我的解決方案: Ajax HTTP Head法
原理:
一般服務器在發送靜態頁面的時候(apache, nginx, lighttpd就目前所知)都是會在 HTTP 頭里帶一個Date的頭信息的,那么我用Ajax直接取頭信息里的Date不就OK了嗎!8)
PS:但ajax發請求出去不是會有正文返回嗎,那正文的內容比請求一次動態頁面的代價可高多了,是這樣的嗎?8)
實現:
- var xhr = new XMLHttpRequest();
- if( !xhr ){
- xhr = new ActiveXObject("Microsoft.XMLHTTP");
- }
- xhr.open("HEAD",location.href,true);
- xhr.onreadystatechange=function(){
- if( xhr.readyState == 4 && xhr.status == 200 ){
- alert(xhr.getResponseHeader("Date"));
- }
- }
- xhr.send(null);
解釋:
常見的Ajax請求方法為GET,POST而這兩種請求都可能會返回正文體,而發HEAD頭則只會返回對應的頭信息,不會有正文,且只要javascript可以執行,就可以取當前域的地址作為請求地址,有一定的通用性,且避免了跨域的問題.:lol:
實踐:
以上代碼的完整版在ie6,7,8,9,opera,chrome,firefox下測試通過
適用范圍:
javascript正常執行的作用域是http/https下生效
其他:
服務器一定會返回Date頭信息嗎?
這個是RFC里要求服務器必須實現的,只有在101,103,500等幾個狀態碼的情況下服務器才可以不返回Date頭.但我們的location.href不在這個情況之列,所以只要當前javascript代碼能正常執行(http方式),那么這個時間就可以取得到
定制的服務器不在本文討論范圍之內
轉載請保留以下內容:
author:mooring
sites: http://mooring.iteye.com
date:2012/02/23
------------------------------
1. jquery封裝的ajax方法獲取web服務器時間
var t = $.ajax({type:'HEAD', async:'false'}).getResponseHeader('date'); //同步請求
2.chrome強烈不建議在主線程發同步的ajax請求,異步的寫法如下:
var t;
$.ajax({type:'HEAD', async: true})
.success(function(data, status, xhr){
t=xhr.getResponseHeader('Date');
});