【问题标题】:JavaScript hard refresh of current pageJavaScript 硬刷新当前页面
【发布时间】:2011-01-07 03:18:53
【问题描述】:

如何强制网络浏览器通过 JavaScript 硬刷新页面?
硬刷新意味着获取页面的新副本并刷新所有外部资源(图像、JavaScript、CSS 等)。

【问题讨论】:

    标签: javascript reload page-refresh window.location


    【解决方案1】:

    上面接受的答案不再做任何事情,只是在当今大多数新版本的网络浏览器上正常重新加载。我已经在我最近更新的 Chrome 上尝试了所有这些,包括 location.reload(true)location.href = location.href<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />。他们都没有工作。

    我的解决方案是使用服务器端功能将非重复查询字符串附加到所有包含的源文件引用,如下例所示。

    <script src="script.js?t=<?=time();?>"></script>

    因此您还需要动态控制它何时保留以前的文件以及何时更新它。唯一的问题是,当插件通过脚本执行文件包含时,您无法控制对其进行修改。不用担心源文件泛滥。当旧文件被取消链接时,它将自动被垃圾收集。

    【讨论】:

      【解决方案2】:

      使用搜索参数更改当前 URL 将导致浏览器将相同的参数传递给服务器,换句话说,这会强制刷新。

      (不过,如果您将拦截与 Service Worker 一起使用,则无法保证。)

        const url = new URL(window.location.href);
        url.searchParams.set('reloadTime', Date.now().toString());
        window.location.href = url.toString();
      

      如果您想支持旧版浏览器:

      if ('URL' in window) {
        const url = new URL(window.location.href);
        url.searchParams.set('reloadTime', Date.now().toString());
        window.location.href = url.toString();
      } else {
        window.location.href = window.location.origin 
          + window.location.pathname 
          + window.location.search 
          + (window.location.search ? '&' : '?')
          + 'reloadTime='
          + Date.now().toString()
          + window.location.hash;
      }
      

      也就是说,强制刷新所有 CSS 和 JS 有点费力。您可能希望为<script><link> 中的srchref 中的所有src 属性执行相同的过程。也就是说,它不会卸载当前的 JS,但对 CSS 可以正常工作。

      document.querySelectorAll('link').forEach((link) => link.href = addTimestamp(link.href));
      

      我不会打扰 JS 示例,因为它可能只会导致问题。

      在编译 HTML 时,您可以通过在 JS 和 CSS 链接中添加时间戳作为搜索参数来省去这个麻烦。

      【讨论】:

        【解决方案3】:

        对于 Angular 用户和 here,您可以执行以下操作:

        <form [action]="myAppURL" method="POST" #refreshForm></form>
        
        import { Component, OnInit, ViewChild } from '@angular/core';
        
        @Component({
          // ...
        })
        export class FooComponent {
          @ViewChild('refreshForm', { static: false }) refreshForm;
        
          forceReload() {
            this.refreshForm.nativeElement.submit();
          }
        }
        

        这个网站解释了它起作用的原因:https://www.xspdf.com/resolution/52192666.html

        您还将在本文中了解硬重载如何适用于每个框架以及更多内容

        解释:角度

        Location:reload(),Location.reload() 方法重新加载当前 URL,就像刷新按钮一样。仅使用 location.reload();如果您想执行强制重新加载(如使用 Ctrl + F5 完成)以便从服务器而不是浏览器缓存重新加载所有资源,这不是一个解决方案。这个问题的解决方案是,对当前位置执行 POST 请求,因为这总是会让浏览器重新加载所有内容。

        【讨论】:

          【解决方案4】:
          window.location.href = window.location.href
          

          【讨论】:

          • 如果浏览器缓存了页面,这将不会从服务器拉取页面。
          • 请在您的答案中添加一些解释,以便其他人可以从中学习
          • 适用于我的情况!我认为它清除了我正在开发的 WordPress 插件中的 POST 数据。
          【解决方案5】:

          尝试使用:

          location.reload(true);
          

          当此方法接收到 true 值作为参数时,它将导致页面始终从服务器重新加载。如果为 false 或未指定,浏览器可能从其缓存中重新加载页面。

          更多信息:

          【讨论】:

          • 我很确定这不会重新加载所有外部资源。您必须通读所有alinkscriptimg 元素,并在硬重新加载之后 之后将随机查询字符串附加到每个外部引用的末尾。或者,在服务器上执行此操作。
          • 它在 2010 年有效吗?它肯定在 2018 年(在 Chrome 中)不起作用。 Chrome 从缓存中加载所有内容(/Home/Index 除外)。它似乎在 Firefox WTH 中工作?
          • 它对我不起作用。这不会清除我使用 ctrl F5 清除的数据
          • 我认为这个功能在 HTML5 中被移除了。
          • 它现在已被浏览器弃用和忽略。
          猜你喜欢
          • 2021-05-24
          • 1970-01-01
          • 2012-08-13
          • 2011-05-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-01
          • 1970-01-01
          相关资源
          最近更新 更多