我刚刚花了半天时间悄悄发疯。
我正在对Site.css文件中的类进行更改,并且它们没有反映在我的计算机上正在开发的站点中。因为我正在通过jQuery学习并使用addClass和removeClass,并且我正在动态创建这些调用的参数,我确信问题出在我的实现中。
结果证明CSS文件已缓存在浏览器中,而我所要做的就是刷新它......
有没有办法强制刷新(最好只在调试期间我猜)?
答案 0 :(得分:52)
“缓存中断”的一种流行方法是在css源中附加参数。通常使用时间戳。我更喜欢“文件最后修改”时间,即。 PHP中的filemtime()
。我确定有一个asp.net函数会给你这个。
然后你的CSS标签变为:
<link rel="stylesheet" type="text/css" media="screen" href="/main.css?123456789"/>
每当CSS文件更新时,都会更改查询参数。
答案 1 :(得分:18)
按 CTRL + F5 对网页上的所有内容进行硬刷,包括脚本和样式表。
此外,您可以从动态服务器页面[php / asp.net]和Response.Expires = -1合并要提供的样式表,这将强制客户端显式加载每个HTTP-GET请求上的css。您也可以在CSS mime类型的Web服务器设置中执行此操作。
答案 2 :(得分:10)
我使用这个技巧:
<link rel="stylesheet" type="text/css" href="cssfile.css?t=<%= DateTime.Now.Ticks %>" media="screen" />
答案 3 :(得分:7)
对于ASP.NET,后面的代码(您可以将它放在实用程序类或母版页中):
public static string GetTimestampedUrl(string virtualPath)
{
var realPath = HostingEnvironment.MapPath(virtualPath);
var file = new FileInfo(realPath);
return VirtualPathUtility.ToAbsolute(virtualPath) + "?" + file.LastWriteTime.ToFileTime();
}
然后在你的页面中:
<link href="<%= GetTimestampedUrl("~/screen.css") %>" rel="stylesheet" type="text/css" media="screen" />
答案 4 :(得分:3)
一个技巧是在样式表的链接中添加QueryString参数
答案 5 :(得分:2)
我不确定所有浏览器,但在IE8中,您可以使用开发人员工具......
转到:
工具 - &gt;开发人员工具(F12)
然后(在您的页面上)在开发人员工具中:
缓存 - &gt;始终从服务器刷新
答案 6 :(得分:2)
这是一个经典问题。您有很多可用的解决方案:
答案 7 :(得分:2)
对于Wordpress用户,以下是代码
<link rel="stylesheet" href="<?php echo get_bloginfo('stylesheet_url')."?d=".date( 'Ymd', time()); ?>" type="text/css" media="screen" />
或者更好一个
<link rel="stylesheet" href="<?php bloginfo('stylesheet_url'); echo '?' . filemtime( get_stylesheet_directory() . '/style.css'); ?>" type="text/css" media="screen, projection" />
干杯!
答案 8 :(得分:2)
我的方法是使用“查询字符串更改”方法绕过缓存(即使在浏览器和代理服务器中)。 由于我正在使用母版页,我像往常一样保持与CSS的链接,但添加了一个ID(此处命名为cssStyleSheet):
<head runat="server">
<link id="cssStyleSheet" href="~/Styles/Default.css" rel="stylesheet" type="text/css" />
然后在代码后面我在Page_Load这行代码中实现,添加一个像“?t = 5343423424234”这样的问题字符串。
Protected Sub Page_Load(…)
If IsNothing(Application("CSSTicks")) = True Then
Application("CSSTicks") = DateTime.Now.Ticks
End If
cssStyleSheet.Attributes("href") = cssStyleSheet.Attributes("href") & "?t=" & Application("CSSTicks")
End Sub
为什么? 在HTML代码中,一些设计人员可以轻松地更改CSS文件,而不会干扰某些“困难”的代码。 使用Application变量,我避免从我的服务器和客户角度(如使用手机)消耗带宽。
如果部署了新的应用程序,则应用程序变量会自动重置,并且如果下载到浏览器(甚至通过代理),则会出现“新”版本的CSS。
答案 9 :(得分:1)
最简单的方法是在浏览器中禁用缓存。如果您不能或不想这样做,可以按ctrl + f5。
您的服务器或asp应用程序也可能正在缓存。您可以在web.config中禁用它,也可以重新启动开发服务器以确保向用户显示最新版本的文件。
答案 10 :(得分:0)
您是否在更改之间保持浏览器畅通?通常只需在更改CSS文件之间关闭所有浏览器窗口,就会告诉浏览器下载新副本。
答案 11 :(得分:0)
为了进一步Ian Kemp's回答利用相关样式表的LastWriteTime
,我编写了一个MVC帮助器来输出<link>
标记,其中包含内置的缓存清除参数。
守则
public static class CssLinkHelper
{
public static IHtmlString StyleSheet(this HtmlHelper helper, string stylesheetname)
{
// define the virtual path to the css file (see note below)
var virtualpath = "~/" + stylesheetname;
// get the real path to the css file
var realpath = HostingEnvironment.MapPath(virtualpath);
// get the file info of the css file
var fileinfo = new FileInfo(realpath);
// create a full (virtual) path to the css file including a cache busting parameter (e.g. /main.css?12345678)
var outputpath = VirtualPathUtility.ToAbsolute(virtualpath) + "?" + fileinfo.LastWriteTime.ToFileTime();
// define the link tag for the style sheet
var tagdefinition = string.Format("<link rel=\"stylesheet\" type=\"text/css\" href=\"{0}\" />", outputpath);
// return html string of the tag
return new HtmlString(tagdefinition);
}
}
<强>用法强>
@Html.StyleSheet("main.css")
<强>输出强>
<link rel="stylesheet" type="text/css" href="/main.css?131393346850223541" />
注意强>
如果您对var virtualpath = "/~" + ...
部分的想法感到疑惑,为什么不将其作为"~/main.css"
传递?我已经以这种方式实现了这个函数,因为我的所有css文件都在一个公共文件夹(/ assets)中,帮助器将在我的输出前面加上公共文件夹名称,即/assets/main.css?131393346850223541
答案 12 :(得分:0)
<link href="~/css/Style.css?t=@DateTime.Now" rel="stylesheet" />
我使用 C# 日期时间使用了这个简单的技巧。