问题:很多时候在修改页面、css和js完成后,上传发现没有效果,这主要是因为浏览器会对一些资源进行缓存,在加载时还是使用的以前的资源,下面是归纳的几种方法。
1. 对于html缓存,可以用mata标签,强制禁止浏览器缓存。
<meta http-equiv="pragma" content="no-cache"> <meta http-equiv="Cache-Control" content="no-cache, must-revalidate"> <meta http-equiv="expires" content="0"> <meta http-equiv="Cache" content="no-cache">
2. 文件 Js Css文件缓存处理
- 文件后面加参数(用版本号)
- url添加随机数、随机时间,Math.random(),new Date().getTime()。
<link rel="stylesheet" href="../css/index.css?v=20200927"/> <script src="../scripts/index.js?v=20200927"></script> URL ?ran=" + Math.random(); URL ?timestamp=+ new Date().getTime();
3. 使用ajax清除浏览器缓存。
- 用ajax请求服务器最新文件,并加上请求头If-Modified-Since和Cache-Control,如下:
$.ajax({ url:'www.haorooms.com', dataType:'json', data:{}, beforeSend :function(xmlHttp){ xmlHttp.setRequestHeader("If-Modified-Since","0"); xmlHttp.setRequestHeader("Cache-Control","no-cache"); }, success:function(response){ //操作 } async:false });
- 直接用cache:false
$.ajax({ url:'www.haorooms.com', dataType:'json', data:{}, cache:false, ifModified :true , success:function(response){ //操作 } async:false });
4. form表单清除缓存
<body onLoad="javascript:document.yourFormName.reset()">
5. 链接地址确认:
比如链接地址:http://baidu.com/index.html 解决办法:页面重定向
//index.html <script> window.location.href = "./index2.html?timestamp=" + new Date().getTime(); </script> // => 这样始终请求的就是不一样的页面
总结:
-
这些方法都可以清除缓存,也不能保证百分百正确。因为我们只关注了客户端,却忽略了服务器端的设置, 如果服务器端nginx设置了Cache-control,他是会覆盖掉我们页面中设置的的
-
Cache-control的,所以有时候我们会发现明明css和js已经加了版本号,但是html文件里面引用的依然是旧的css和js文件,因为服务器的缓存机制,旧的css和js并不会被立即删除,这种情况下, 我们需要和服务器端(或者运维)人员协商一个统一的缓存策略,以保证更新可以及时得到效果,如果沟通不顺利,或者想立刻看到效果,可以试试 如果服务器端没有去设置Pragma,我们设置的Pragma依然有效。