Chrome /网络浏览器重新缓存幻觉

时间:2015-05-05 00:47:06

标签: javascript google-chrome

好的,所以我提出了一种很酷的方法,只有在文件被修改时才强制文件重新缓存。以下是JS中的以下代码:

function getCookie(name) {
    var value = "; " + document.cookie;
    var parts = value.split("; " + name + "=");
    if (parts.length == 2) {
        return parts.pop().split(";").shift()
    } else {
        return ''
    }
}
function fetchHeader(url, wch) {
    try {
        var req = new XMLHttpRequest();
        req.open("HEAD", url + '?t=' + Date.now(), false);
        req.send(null);
        if (req.status == 200) {
            return req.getResponseHeader(wch);
        } else return false;
    } catch (er) {
        return er.message;
    }
}
if (['npcdata.txt'].indexOf(u) != -1) {
    lastModified = fetchHeader(u, 'Last-Modified');

    if (lastModified != getCookie(u)) {
        fc = '?=' + Date.now() + '';
        document.cookie = u + '=' + lastModified + '';
    }
} else {
    fc = ''
}
x = this.ActiveXObject;
x = new(x ? x : XMLHttpRequest)('Microsoft.XMLHTTP');
x.open(d ? 'POST' : 'GET', u + fc, 1);
--sniped code, rest of ajax request data here like (x.send)--

现在,请原谅我的长代码。基本上它执行HEAD HTTP Request来检查文件头和上次修改日期。然后,它将它与存储在用户cookie中的该文件的最后修改日期进行比较,如果它不同,我将?=Date.now()字符串应用到AJAX URL的末尾,并使用我的x参数下载新文件。 工作正常!并显示新修改的文​​件内容。

问题是......出于一些非常奇怪的原因,在用?t=Date.now()下载新文件后,它会读取文件的新更改,但是在另一次刷新后,该数据不会被缓存。在我应用?t=Date.now()之前,它会返回到原始的npcdata.txt值。这对我没有任何意义。

为什么在网址的末尾添加?t=Date.now()字符串会抓取新数据,但不会re-cache新文件?但它给了我一种错觉,因为当文件是用AJAX请求?t=字符串时,它会显示更新后的版本然后繁荣,在?t=Date.now()字符串被删除后,它会回到原始缓存版本?什么?

因此,通过检查上次修改日期,修改文件 是不可能的?必须使用Javascript。

1 个答案:

答案 0 :(得分:0)

我发现了这个问题。

我猜Chrome会保存所请求的文件,?t=因为它自己已缓存,并且不会重新缓存文件的来源。我怀疑每次为每个新的缓存文件重新更新缓存时都会出现性能问题,并在其上递归新的时间戳。所以,这是有道理的。

修复是我只需要将用户cookie中保存的时间戳添加到?t=参数。所以,例如在我的代码中它将是:

fc='?='+getCookie(u)+'';

这样,该文件将始终具有相同的确切版本号并保持缓存,如果已修改,则会更新和更改。

作为该截图的pertinent,它看起来有点难看,但我们可以稍后在Javascript中更改数据值,以使URL更漂亮。

这里出了什么问题?我只是认为应用?t='+Date.now()+'会重新缓存ORIGINAL文件,但事实并非如此。您需要保持相同的值(无论您将其存储在何处),并将其应用于?t=参数。对于新的缓存文件,它会起作用。