使用javascript获取文件的修改时间戳

是否可以仅使用JavaScript获取文件的修改时间戳?

我使用JSON文件通过javascript填充页面,我想显示该JSON文件的时间戳。

如果您通过true ajax(即通过XMLHttpRequest )检索文件,则可以执行此操作,前提是您将服务器配置为在发送数据时发送Last-Modified标头。

这里的基本要点是,当您使用XMLHttpRequest ,您可以访问响应头。 因此,如果服务器发回Last-Modified ,您可以使用它:

 var xhr = $.ajax({ url: "data.json", success: function(response) { display("Data is " + response.data + ", last modified: " + xhr.getResponseHeader("Last-Modified")); } }); 

刚试过Chrome,Firefox,IE8和IE11。 工作得很好(即使数据来自缓存)。


您已经在下面说过,您需要在循环中执行此操作,但是您会一直看到变量的最后一个值。 这告诉我你做过这样的事情:

 // **WRONG** var list = /*...some list of URLs...*/; var index; for (index = 0; index < list.length; ++index) { var xhr = $.ajax({ url: list[index], success: function(response) { display("Data is " + response.data + ", last modified: " + xhr.getResponseHeader("Last-Modified")); } }); } 

问题在于,所有success回调都对xhr变量有持久的引用 ,并且只有其中一个。 所以所有的回调都会看到分配给xhr的最后一个值。

这是典型的闭包问题。 这是一个解决方案:

 var list = /*...some list of URLs...*/; list.forEach(function(url) { var xhr = $.ajax({ url: url, success: function(response) { display("Data for " + url + " is " + response.data + ", last modified: " + xhr.getResponseHeader("Last-Modified")); } }); }); 

由于forEach回调的每次迭代都有自己的xhr变量,因此没有串扰。 (你需要在旧版浏览器上使用shim forEach 。)


你说下面的话:

我已经考虑了一个闭包问题,这就是为什么我在我的循环中使用了一个数组xhr[e] ...但是你的例子有助于...

并在一个要点中链接到此代码:

 //loop over e.... nodename=arr[e]; node_json=path_to_node_json+nodename; html +='data' +''; xhr[e] = $.ajax({ url: node_json, success: function(response) { $('#host_'+nodename).append("last modified: " + xhr[e].getResponseHeader("Last-Modified")); } }); 

这仍然有经典错误:您的success函数关闭变量 e ,而不是创建success函数时的值,因此在success函数运行时, e具有在循环中分配给它的最后一个值。

我之前给出的forEach示例非常适合:

 // (I assume `node_json`, `html`, and `path_to_node_json` are all declared // here, outside the function.) arr.forEach(function(nodename) { var xhr; // <=== Local variable in this specific call to the iteration // function, value isn't changed by subsequent iterations node_json=path_to_node_json+nodename; html +='data' +''; xhr = $.ajax({ url: node_json, success: function(response) { // Note: You haven't used it here, but just to emphasize: If // you used `node_json` here, it would have its value as of // the *end* of the loop, because it's not local to this // function. But `xhr` is local, and so it isn't changed on // subsequent iterations. $('#host_'+nodename).append("last modified: " + xhr.getResponseHeader("Last-Modified")); } }); });