好的,所以我提出了一种很酷的方法,只有在文件被修改时才强制文件重新缓存。以下是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。
答案 0 :(得分:0)
我发现了这个问题。
我猜Chrome会保存所请求的文件,?t=
因为它自己已缓存,并且不会重新缓存文件的来源。我怀疑每次为每个新的缓存文件重新更新缓存时都会出现性能问题,并在其上递归新的时间戳。所以,这是有道理的。
修复是我只需要将用户cookie中保存的时间戳添加到?t=
参数。所以,例如在我的代码中它将是:
fc='?='+getCookie(u)+'';
这样,该文件将始终具有相同的确切版本号并保持缓存,如果已修改,则会更新和更改。
作为该截图的pertinent,它看起来有点难看,但我们可以稍后在Javascript中更改数据值,以使URL更漂亮。
这里出了什么问题?我只是认为应用?t='+Date.now()+'
会重新缓存ORIGINAL文件,但事实并非如此。您需要保持相同的值(无论您将其存储在何处),并将其应用于?t=
参数。对于新的缓存文件,它会起作用。