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

时间:2014-07-31 14:52:59

标签: javascript jquery

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

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

1 个答案:

答案 0 :(得分:2)

如果您通过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回调都有{em>持久引用到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变量,因此没有串扰。 (您需要在旧浏览器上填充forEach。)


你在下面说:

  

我已经考虑过闭包问题了,这就是我在xhr[e]循环中使用数组e的原因...   但是你的例子是帮助......

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

//loop over e....
nodename=arr[e];
node_json=path_to_node_json+nodename;
html +='<a href="'+node_json+'" target="_blank" id="host_'+nodename+'">data</a></td>'
    +'</tr>';
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 +='<a href="'+node_json+'" target="_blank" id="host_'+nodename+'">data</a></td>'
        +'</tr>';
    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"));
        }
    });
});