【问题标题】:How to force IE to reload javascript?如何强制 IE 重新加载 javascript?
【发布时间】:2009-05-15 01:08:53
【问题描述】:

我在 Vista 上使用 IE 8,每次我更改一个 javascript 文件然后开始调试时,我都必须按 Ctrl+F5 让它重新加载我的 javascript。有什么办法可以让它在我开始调试时自动重新加载javascript,而不会在浏览网络时失去性能提升?

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

【问题讨论】:

    标签: javascript internet-explorer internet-explorer-8


    【解决方案1】:

    在 URL 的末尾添加一个字符串以中断缓存。我通常这样做(使用 PHP):

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

    这样每次我在处理它时它都会重新加载,然后在它投入生产时将其取下。实际上,我将其抽象了一点,但想法保持不变。

    如果您查看本网站的来源,他们会以类似的方式在 URL 末尾附加修订号,以便在他们更新 javascript 文件时强制我们进行更改。

    【讨论】:

    • 不错的选择,只是它意味着浏览器将永远缓存文件,这意味着您“在浏览网络时会失去性能提升”。
    • 当“只是浏览您当前正在处理的网站”时,您会失去性能提升。
    • 好吧,我以为你是打算接受这个。 (请记住,最终用户也会遇到缓存问题,因此确保当您的 .js 文件更改时,用户的浏览器也知道要获取最新版本,这不是一个坏主意。
    • 你如何在生产中修复它,这样它就不会每次都重新加载?更新 javascript 文件时更改所有相关页面。无需对存储库中的页面进行任何不必要的更改。
    • 正如@Paolo 上面建议的那样,只需将修订号附加到 URL 的末尾即可。 somescript.js?r=2011.07.24 或其他。您还可以附加上次修改日期的编码版本。这允许浏览器只缓存最新版本的脚本。当脚本更新时,URL 会发生变化,因此浏览器会再次获取文件。
    【解决方案2】:

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

    所以要么是这样的:

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

    或许

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

    我更喜欢第一个选项,因为这意味着您可以维护一个文件,而不必不断地重命名它(例如,在源代码管理中保持一致的版本历史记录)。当然,任何一个(正如我所描述的)都会涉及每次更新您的包含语句,因此您可能想要提出一种动态的方法,例如每次部署时将固定值替换为动态值(使用 Ant 或其他)。

    【讨论】:

    • 也能在 Firefox 和 Chrome 中工作吗?
    • 我将采用这个想法并尝试在我的页面加载事件中(在 .Net 中)根据日期时间创建一个版本号(你和 Paolo 的想法的混合),因为这正成为一个真正令人头疼的问题。对我个人来说不一定,但是当我将 JS 更新给我们的测试人员时,他们忘记了 CTRL F5,然后在修复错误后发回......(只需要确保我在生产之前把它拿出来!)
    • 这就像一个魅力: String jsDateTime = DateTime.Now.ToString().Replace(" ", "").Replace("/", "").Replace(":", ""); LiteralControl jsMain = new LiteralControl(); jsMain.Text = ""; Page.Header.Controls.Add(jsMain);
    • &lt;script src="/my/js/file.js?version=2.1.3" &gt;&lt;/script&gt; thsi 不适用于 IE 11。
    【解决方案3】:

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

    按照这个简单的步骤。

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

    【讨论】:

    • 这并不像你认为的那样。有关每个设置的讨论,请参见 www.enhanceie.com/redir/?id=httpperf。
    • 我这样做了,但仍然需要刷新页面或按 F5?
    【解决方案4】:

    如果您只想在您的浏览器上执行此操作(也就是不强制您的用户执行此操作),那么我不会将您的代码设置为不使用缓存。正如 José 所说,存在性能损失。

    而且我不会完全关闭 IE 上的缓存,因为您访问的每个网站都会失去性能提升。您可以告诉 IE 始终从服务器刷新特定站点或浏览会话:

    1. 打开 IE 开发者工具
    2. 从菜单中选择缓存
    3. 点击勾选“始终从服务器刷新”

    或者,对于那些喜欢键盘快捷键的人(比如我自己)..

    • F12、Alt+C、向下箭头、Alt+R。

    注意事项: 话虽如此...请记住,无论何时您以与在生产中查看站点不同的方式进行开发/测试,都会冒着得到混合结果的风险。一个很好的例子就是这个缓存问题。我们发现了一个问题,即 IE 正在缓存我们的 Ajax 调用,而不是从 GET 方法更新结果。如果我们在 IE 中禁用了缓存,我们将永远不会在开发中看到这个问题,并且会像这样将其部署到生产环境中。

    【讨论】:

    • 在您的“注意事项”上,这就是为什么许多开发商店都有一个特殊的测试环境,其目标是尽可能地镜像生产。例如,如果您在 Windows 上开发/测试,但您的生产服务器是 Linux,那么您应该有另一个在 Linux 上运行的测试环境。
    • 项目“F12...”适用于我,IE 8。不适用于 IE11。
    • IE 11 等效项:Tools &gt; Internet Options &gt; General &gt; Browsing History &gt; Settings &gt; Temporary Internet Files &gt; Check for newer versions of stored pages: Every time I visit the webpage
    【解决方案5】:

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

    • 用 F12 键打开 IE Developer Tools
    • 转到网络选项卡
    • 点击“始终从服务器刷新”按钮

    (对不起法国人)

    【讨论】:

      【解决方案6】:

      在javascript中我认为这是不可能的,因为现代浏览器在javascripts中有一个policy on security..而清除缓存是非常违规的。

      你可以尝试添加

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

      在你的标题中,但你会有性能损失。

      【讨论】:

        【解决方案7】:

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

        完整示例:

        【讨论】:

        • 这将强制每次重新加载脚本。而不是当前时间,只需使用应用程序的时间,如(new FileInfo(Assembly.GetExecutingAssembly().Location)).LastWriteTime.ToString("yyyyMMddhhmm");
        【解决方案8】:

        在您的 URL 末尾添加 js 文件的修改日期。使用 PHP,它看起来像这样:

        echo '<script type="text/javascript" src="js/something.js?' . filemtime('js/something.js') . '"></script>';
        

        每次更新脚本时都会重新加载脚本。

        【讨论】:

          【解决方案9】:

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

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

          您可以声明一个指向您的 javascript 文件的“捆绑包”。每次您的文件更改时,它都会生成一个新的查询字符串后缀......但只有在文件更改时才会这样做。这使得部署更新变得非常简单,因为您甚至不必考虑使用新版本号更新您的标签。

          它还可以将多个 .js 文件捆绑到一个文件中,然后将它们缩小,一步完成。同上 css。

          【讨论】:

          • 如果有人要否决这个看似理想的解决方案,他们可能应该评论说明原因。这正是我正在寻找的,一种允许浏览器缓存文件的方法,但在进行更改时强制它重新加载它们。
          【解决方案10】:

          要避免在开发网站时在 IE 选项卡中反复按 F5,请使用 ReloadIt

          对于在 IE 中显示的每个网页,您可以配置一个文件名、一个目录或一组。如果这些配置路径中的任何一个发生任何更改,ReloadIt 会刷新 IE 选项卡。一个简单的工具。它只是工作。

          这将重新加载所有内容,而不仅仅是 javascript。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-01-21
            • 1970-01-01
            • 2012-03-26
            • 2014-03-02
            • 2016-02-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多