如何用JavaScript清除浏览器缓存?

我们部署了最新的JavaScript代码,但是我们无法获得最新的JavaScript代码。

编者按:这个问题在以下几个地方有半重复,下面第一个问题的答案可能是最好的。这个公认的答案不再是理想的解决方案。

如何强制浏览器重新加载缓存的CSS/JS文件?

如何强制客户端刷新JavaScript文件?

动态重载本地Javascript源/ json数据


当前回答

更新:请参见location.reload()没有参数作为这个非标准参数的背景,以及Firefox如何可能是唯一支持的现代浏览器。


您可以调用window.location.reload(true)来重新加载当前页面。它将忽略任何缓存项,并从服务器检索页面、css、图像、JavaScript等的新副本。这不会清除整个缓存,但会清除您所在页面的缓存。

但是,最好的策略是对路径或文件名进行版本控制,就像在其他各种答案中提到的那样。此外,请参阅旋转文件名:由于不使用?v=n作为版本控制方案的原因,不要使用querystring。

其他回答

Maybe "clearing cache" is not as easy as it should be. Instead of clearing cache on my browsers, I realized that "touching" the file will actually change the date of the source file cached on the server (Tested on Edge, Chrome and Firefox) and most browsers will automatically download the most current fresh copy of whats on your server (code, graphics any multimedia too). I suggest you just copy the most current scripts on the server and "do the touch thing" solution before your program runs, so it will change the date of all your problem files to a most current date and time, then it downloads a fresh copy to your browser:

<?php
    touch('/www/control/file1.js');
    touch('/www/control/file2.js');
    touch('/www/control/file2.js');
?>

...剩下的程序…

我花了一些时间来解决这个问题(因为许多浏览器对不同的命令有不同的行为,但它们都检查文件的时间,并将其与浏览器中下载的副本进行比较,如果日期和时间不同,将进行刷新),如果你不能按照假设的正确方式进行,总有另一种可用的更好的解决方案。祝你露营愉快。

或者你可以通过服务器用file_get_contts读取js文件,然后在js内容的头中放入echo

裁判:https://developer.mozilla.org/en-US/docs/Web/API/Cache/delete

Cache.delete ()

方法

语法:

cache.delete(request, {options}).then(function(found) {
  // your cache entry has been deleted if found
});

除了每小时或每周缓存一次之外,您还可以根据文件数据进行缓存。

示例(PHP):

<script src="js/my_script.js?v=<?=md5_file('js/my_script.js')?>"></script>

甚至使用文件修改时间:

<script src="js/my_script.js?v=<?=filemtime('js/my_script.js')?>"></script>

把这个放在模板的末尾:

var scripts =  document.getElementsByTagName('script');
var torefreshs = ['myscript.js', 'myscript2.js'] ; // list of js to be refresh
var key = 1; // change this key every time you want force a refresh
for(var i=0;i<scripts.length;i++){ 
   for(var j=0;j<torefreshs.length;j++){ 
      if(scripts[i].src && (scripts[i].src.indexOf(torefreshs[j]) > -1)){
        new_src = scripts[i].src.replace(torefreshs[j],torefreshs[j] + 'k=' + key );
        scripts[i].src = new_src; // change src in order to refresh js
      } 
   }
}