当前位置: 首页 > 面试题库 >

防止jQuery缓存使用html(…)函数的AJAX回调过程中加载的资源破坏

皇甫才良
2023-03-14
问题内容

使用jQuery 1.7.1,我通过AJAX加载了一些HTML片段,这些片段是通过html()方法注入到DOM中的。

HTML内容本身不能被缓存,但是它可能会加载一些可以缓存的JavaScript资源。

我发现的是,当我在$.ajax调用中禁用缓存时,当HTML注入DOM时,这会将缓存清除参数添加到所有由jQuery发出的HTTP请求中。这样可以防止浏览器缓存原本静态的JavaScript资源。

我当前的解决方案不是很优雅,在这方面似乎很合情合理。在AJAX调用成功之后,但在处理HTML之前,我基本上翻转了全局缓存选项。

var $dynamic = $('#dynamic');
$.ajax({
          url: href,
          cache: false,
          dataType: 'html',
          success: function(data, textStatus, jqXHR) {
              // This is hokey, but needed to allow browser to cache
              // resources loaded by the fragment
              $.ajaxSetup({cache:true});
              $dynamic.empty().html(data);
              $.ajaxSetup({});
          }
});

谁能想到一种更好的方法呢?我是否应该避免<script rel=...>在加载了AJAX的片段中使用标记,而是使用其他方法加载了JavaScript?

旁注,似乎有一些相关的SO问题,但是其中一个问题的答案不是公认的答案,而另一个问题则表明行为在jQuery 1.4中已更改,因此这可能是某种回归。

编辑

详细地说,上面的jQuery代码段被应用于一个div元素。整理成这样:

<html>
  <head>
      // ... load jquery ...

      <script type="text/javascript">
         $(document).ready(function() {
            var $dynamic = $('#dynamic');
            $('a').click(function(e) {
                e.preventDefault();

                var $a = $(this);
                var href = $a.attr('href');
                $.ajax({
                    url: href,
                    cache: false,
                    dataType: 'html',
                    success: function(data, textStatus, jqXHR) {
                        $.ajaxSetup({cache:true});
                        $dynamic.empty().html(data);
                        $.ajaxSetup({});
                    } 
                });
            });
         });
      </script>
  </head>
  <body>
      <a href="/api/dynamic-content/">Click Here</a>
      <div id="dynamic"></div>
  </body>
</html>

事件发生时(在这种情况下为单击),处理程序将调用$.ajax以将text /
html片段加载到#dynamicdiv元素中。这是一个这样的片段可能看起来像的示例:

<p>Some dynamic content here...</p>
<script type="text/javascript" src="/static/some.js"></script>

因此,successAJAX调用的处理程序加载了text / html代码段,并通过jQuery
html(...)函数将其注入到DOM中。如您所见,text / html片段也可能具有指向外部脚本的链接。

有关的文档html(...)表明,这种使用模式还不错,并且脚本资源将按照预期的方式加载和执行。

我遇到的问题是text / html片段的内容不可缓存,必须使用缓存清除机制调用。但是,它需要加载的JavaScript资源
静态且可缓存的,但是jQuery在加载JS资源时会应用缓存清除,因为最初的AJAX调用是使用cache : false

细分而言,这是事件链:

  • 点击处理程序已调用
  • AJAX函数执行 HTTP GET /api/dynamic-content/?_=1331829184164
  • 成功处理程序调用 $dynamic.empty().html(data);
  • $dynamic.empty().html(...) 施行 HTTP GET /static/some.js?_=1331829184859

我正在寻找一种更优雅的方法来禁用对text / html片段注入DOM后触发的后续或“内部” HTTP请求的缓存清除功能,该请求被触发以加载JS资源。

简而言之,其他所有事情都是正确的,我只是想让它做HTTP GET /static/some.js,而不是HTTP GET /static/some.js?_=1331829184859最后一步。


问题答案:

如果将服务器设置为正确标识可以和不可以缓存哪些资源,则该cache: false选项将不是必需的。

另一种选择是在方法上使用a POST而不是GETusing type: 'POST'选项ajax



 类似资料:
  • 我发现了与jQuery相关的类似问题。我的目标是找出如何防止jQueryMobile和PhoneGap中的缓存(我使用JSONP)。我正在进行一些ajax调用,动态地填充listview。我想在每次初始化页面(pageinit)时查询web服务。在我的android设备上,在新的查询之后,每次我进入页面时,数据都会添加到listview中。它不会删除,每次我访问页面时,我都会添加一个副本。我认为这

  • 问题内容: 我正在使用jQuery的网页上工作。我有一个Ajax调用,它从服务器获取数据并更新div。在该数据内部有一个jQuery函数,但是在将数据加载到页面中之后未调用该函数。我已经在页面中包含了正确的js文件。 这是从Ajax调用返回并放入div的内容: 将html插入页面后,如何使返回的javascript运行? (我将Rails与jRails插件结合使用) 问题答案: 如果要对具有htm

  • 问题内容: 好像我使用加载动态内容,结果缓存在浏览器中。 在QueryString中添加一些随机字符串似乎可以解决此问题(我使用),但这听起来像是一种hack。 还有其他方法可以做到这一点吗?或者,如果唯一字符串是实现此目标的唯一方法,则除之外还有其他建议吗? 问题答案: 我使用,这将避免冲突,除非您在同一毫秒内发生多个请求: 编辑: 这个答案已经好几年了。它仍然有效(因此我没有删除它),但是 现

  • 问题内容: 我已经审查了很多有关此类问题的答案,但现在我对最佳方法感到困惑。鉴于最新的jquery,我想 调用一个ajax函数 做ajax处理(成功或错误)//正常工作 成功或错误时,将状态返回到调用函数以进行进一步处理 在调用函数(doAjax)中,如何等待回调,然后完成对成功或错误的处理(在这种情况下,成功时清除表格,错误时保持原样) 感谢任何建议, Art [EDIT] 你们发现有一个错字,

  • 我有从我的网页生成的AJAX POST请求,可能有多个POST请求具有相同的POST数据。但是响应可能会有所不同,我希望确保我没有得到这些请求的缓存响应。我需要每个请求点击网页。 我假设对POST请求的响应不会被缓存,这对吗?

  • 问题内容: 在iPad项目中,我正在研究该应用程序的内部,该应用程序显示一个.html文件,该文件链接到.css文件,即 这些文件存储在iPad本地,但从远程服务器获取。我注意到,它会无限期地缓存.css文件,并且无论何时更改都会拒绝加载新文件。我曾经更改过文件的名称只是为了使其重设,但是从长远来看,这是不可接受的。 有没有一种方法可以防止将CSS文件缓存在中?甚至更好的是,有什么方法可以说何时缓