如何强制IE重新加载JavaScript?

44

我在Vista上使用IE 8,每次更改javascript文件后开始调试时,都需要按Ctrl+F5重新加载我的javascript。有没有办法使它在开始调试时自动重新加载javascript,但在仅浏览网络时不失去性能优势?

是的,我知道你可能不喜欢IE,但请记住问题不是“什么是最好的浏览器?”。

10个回答

48

在您的URL末尾添加一个字符串以打破缓存。 我通常使用以下方法(使用PHP):

<script src="/my/js/file.js?<?=time()?>"></script>

为了在我工作时每次重新加载它,并在进入生产环境时将其取消。实际上,我会更加抽象化,但是这个想法保持不变。

如果你查看这个网站的源代码,他们以类似的方式将修订号附加到URL的末尾,以强制我们在更新JavaScript文件时进行更改。


5
当你只是浏览当前正在工作的网站时,你失去了性能提升。 - Paolo Bergantino
3
如@Paolo所建议的那样,只需将修订号附加到URL的末尾,例如somescript.js?r=2011.07.24。您还可以附加最后修改日期的编码版本。这使浏览器仅缓存脚本的最新版本。当脚本更新时,URL也会更改,因此浏览器会再次获取文件。 - BMiner
请问我该如何将那行代码加入到我的程序中呢?另外,我还有一个刷新问题。在我的 .php 文件中,我在顶部添加了以下内容: <?php use_javascripts_for_form($moodmeter_form) ?>同时,我也有一个 rainbow.js 文件。 谢谢。 - charlie_cat
我认为最好定义一个版本 ID 变量,然后在包含 JS 文件的末尾使用此变量。这样 JavaScript 文件只会在开发人员想要重新加载它时才重新加载,只需更改版本变量的值即可。 - Luci
@PaoloBergantino 你知道IE 10在没有用户输入的情况下清除缓存的频率吗?我以为可能是每24小时一次。我错了吗? - Mr. Concolato
显示剩余3条评论

25

保罗的一般思路(即有效更改请求URI的某些部分)是您最好的选择。但是,我建议使用更静态的值,例如版本号,在更改脚本文件时更新,以便仍然可以获得缓存的性能提升。

因此,可以尝试像这样的代码:

<script src="/my/js/file.js?version=2.1.3" ></script>

或者可能是

<script src="/my/js/file.2.1.3.js" ></script>

我更喜欢第一种选项,因为这意味着您可以维护一个文件而不是不断地重命名它(例如,在源代码控制中保持一致的版本历史记录)。当然,无论哪种选项(如我所描述的),都需要每次更新您的包含语句,因此您可能需要想出一种动态的方法来完成它,例如每次部署时使用 Ant 或其他工具替换固定值为动态值。


<script src="/my/js/file.js?version=2.1.3" ></script> 这段代码在Firefox和Chrome中也能工作吗? - BrianK
我打算在我的页面加载事件(在.Net中)中尝试采用这个想法,根据日期时间创建一个版本号(类似于你和Paolo的想法的混合),因为这变成了一个真正的头痛。不一定是针对我个人,但当我将JS更新给我们的测试人员时,他们会忘记CTRL F5,然后在已经修复的bug之后发送回来...(只需要确保在生产之前将其删除!) - Todd Vance
这个代码非常好用:String jsDateTime = DateTime.Now.ToString().Replace(" ", "").Replace("/", "").Replace(":", "");LiteralControl jsMain = new LiteralControl();jsMain.Text = "<script type="text/javascript" src="js/main2.js?version=" + jsDateTime + ""></script>";Page.Header.Controls.Add(jsMain); - Todd Vance
<script src="/my/js/file.js?version=2.1.3" ></script> 这在IE 11上不起作用。 - Afnan Ahmad

18

当您处理网页或JavaScript文件时,希望每次更改后它都会重新加载。 您可以更改IE 8的设置以使浏览器永远不缓存。

按照以下简单步骤。

  1. 选择工具-> Internet选项。
  2. 在常规选项卡中,在“浏览历史记录”部分单击“设置”按钮。
  3. 点击“每次访问网页时”单选按钮。
  4. 单击确定按钮。

3
那并不是你想象的那样。请访问www.enhanceie.com/redir/?id=httpperf,了解每个设置的讨论。 - EricLaw
我已经做了这个,但是还需要刷新页面或按F5吗? - charlie_cat

6
如果仅想在您的浏览器上执行此操作(即不强制用户执行),则不要设置代码以不使用缓存。正如José所说,这会导致性能下降。
我也不会完全关闭IE上的缓存,因为您会失去每个访问的网站带来的性能提升。您可以告诉IE始终从服务器刷新特定网站或浏览会话:
1.打开IE开发人员工具 2.选择菜单中的“缓存” 3.点击“始终从服务器刷新”
或者,对于像我这样的键盘快捷键迷。。。
F12、Alt+C、向下箭头、Alt+R。
请注意:开发/测试方式与生产中查看网站的方式不同,就存在获得混乱结果的风险。一个很好的例子是这个缓存问题。我们发现IE会缓存我们的Ajax调用,并且不会更新GET方法的结果。如果我们在IE中禁用了缓存,则在开发过程中就可能永远无法发现此问题,并将其部署到生产环境中。

在你的“注意事项”中,这就是为什么许多开发商都有一个特殊的测试环境,其目标是尽可能地模拟生产环境。例如,如果你在Windows上进行开发/测试,但你的生产服务器是Linux,那么你应该有另一个运行在Linux上的测试环境。 - michaelok
这个项目“F12…”在我的IE 8上可以使用,但在IE11上无法使用。 - youngzy
1
IE 11的等效操作:工具 > Internet选项 > 常规 > 浏览历史记录 > 设置 > 临时互联网文件 > 检查是否有更新版本的存储页面:每次访问网页 - paulsm4

2
如果您使用IE11浏览器,可以通过IE开发人员工具告诉IE始终从服务器刷新特定的浏览会话。

  • 按F12键打开IE开发人员工具
  • 进入“网络”选项卡
  • 单击“始终从服务器刷新”按钮

始终从服务器刷新按钮

(对不起,这是法语截图)


1

这对于ASP.NET应该管用。概念与PHP示例中所示相同。由于每次加载脚本时URL都不同,因此浏览器或代理都不应缓存文件。 我习惯将JavaScript代码放入单独的文件中,并且在使用Visual Studio时浪费了大量时间,直到我意识到它不会重新加载JavaScript文件。

<script src="Scripts/main.js?version=<% =DateTime.Now.Ticks.ToString()%>" type="text/javascript"></script>

完整示例:

<%@ Page Title="主页" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>
<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
<script src="Scripts/jquery-1.4.1-vsdoc.js" type="text/javascript"></script> <script src="Scripts/main.js?version=<% =DateTime.Now.Ticks.ToString()%>" type="text/javascript"></script> <script type="text/javascript">
$(document).ready(function () { myInit(); });
</script> </asp:Content>

显然,这个解决方案只应在开发阶段使用,并在发布网站之前删除。


这将强制每次重新加载脚本。而不是使用当前时间,只需使用应用程序的时间,例如(new FileInfo(Assembly.GetExecutingAssembly().Location)).LastWriteTime.ToString("yyyyMMddhhmm"); - akop

1
在您的URL末尾添加JS文件的修改日期。使用PHP,它看起来应该像这样:
echo '<script type="text/javascript" src="js/something.js?' . filemtime('js/something.js') . '"></script>';

当您更新脚本时,每次都会重新加载它。


1
如果您正在运行ASP.Net,请查看在ASP.Net 4.5中提供的捆绑和最小化模块。

http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification

你可以声明一个指向JavaScript文件的"bundle"。每当文件更改时,它将生成一个新的查询字符串后缀...但仅在文件更改时才会这样做。这使得更新部署变得非常简单,因为您甚至不必考虑使用新版本号更新您的标签。

它还可以将多个.js文件一起打包到一个文件中,并在一步中进行最小化处理。css也是如此。

如果有人要对这个看似理想的解决方案进行负评,他们应该在评论中说明原因。这正是我正在寻找的,一种允许浏览器通常缓存文件,但在进行更改时强制重新加载它们的方法。 - Jason Kelley

1
在JavaScript中,我认为这是不可能的,因为现代浏览器对JavaScript有安全策略,清除缓存是一种非常侵犯性的行为。
你可以尝试添加


<META HTTP-EQUIV="Pragma" CONTENT="no-cache">

虽然可以将其放在头文件中,但会导致性能损失。


0
为了在开发网站时不需要反复按F5键来刷新IE选项卡,可以使用ReloadIt

enter image description here

对于在IE中显示的每个网页,您可以配置文件名、目录或它们的集合。如果这些配置路径中的任何一个发生更改,ReloadIt 将刷新IE选项卡。 这是一个简单的工具。 它只需要工作。 这将重新加载所有内容,而不仅仅是JavaScript。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接