【问题标题】:Can't disable jQuery cache无法禁用 jQuery 缓存
【发布时间】:2011-02-23 22:26:21
【问题描述】:

更新

我发现它一定是缓存问题,但我无法关闭缓存。 这是我修改后的脚本:

<script src="../../Scripts/jquery-1.4.1.js" type="text/javascript"></script>
<script type="text/javascript">
        jQuery.ajaxSetup({
            // Disable caching of AJAX responses 
            cache: false
        });

        jQuery("#button1").click(function (e) {
            window.setInterval(refreshResult, 3000);
        });

        function refreshResult()
        {
            jQuery("#divResult").load("/Home/Refresh");
        }
</script>

它每 3 秒更新一次网页的一部分。清除浏览器缓存后只运行一次,之后就失效了——请求/Home/Refresh没有3秒的间隔,从服务器发送数据,但网页上什么都没有显示;后续请求发送 cookie ASP.NET_SessionId=wrkx1avgvzwozcn1frsrb2yh。 我正在使用 ASP.NET MVC 2 和 c#。




我的 jQuery 有问题,这是我的网络应用程序的工作方式

  • 包含表单和 jQuery 脚本的 Search.aspx 网页在用户单击 button1 按钮后将数据发布到 Home 控制器中的 Search() 操作。

搜索.aspx:

<%@ Page Title="" Language="C#" 
    MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage<GLSChecker.Models.WebGLSQuery>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Title  
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <h2>Search</h2>

    <% Html.EnableClientValidation(); %>

    <% using (Html.BeginForm()) {%>    
        <fieldset>
            <div class="editor-label">
                <%: Html.LabelFor(model => model.Url) %>
            </div>
            <div class="editor-field">
                <%: Html.TextBoxFor(model => model.Url, 
                    new { size = "50" } ) %>
                <%: Html.ValidationMessageFor(model => model.Url) %>
            </div>

            <div class="editor-label">
                <%: Html.LabelFor(model => model.Location) %>
            </div>
            <div class="editor-field">
                <%: Html.TextBoxFor(model => model.Location, 
                    new { size = "50" } ) %>
                <%: Html.ValidationMessageFor(model => model.Location) %>
            </div>

            <div class="editor-label">
                <%: Html.LabelFor(model => model.KeywordLines) %>
            </div>
            <div class="editor-field">
                <%: Html.TextAreaFor(model => model.KeywordLines, 10, 60, null)%>  
                <%: Html.ValidationMessageFor(model => model.KeywordLines)%>
            </div>

            <p>
                <input id ="button1" type="submit" value="Search" />
            </p>
        </fieldset>

    <% } %>

    <script src="../../Scripts/jquery-1.4.1.js" type="text/javascript"></script>
    <script type="text/javascript">
        jQuery("#button1").click(function (e) {
            window.setInterval(refreshResult, 5000);
        });

        function refreshResult()
        {
            jQuery("#divResult").load("/Home/Refresh");
        }
    </script>

   <div id="divResult"> 
   </div>

</asp:Content>
[HttpPost] 公共 ActionResult 搜索(WebGLSQuery queryToCreate) { if (!ModelState.IsValid) 返回视图(“搜索”); queryToCreate.Remote_Address = HttpContext.Request.ServerVariables["REMOTE_ADDR"]; 会话[“结果”] = null; SearchKeywordLines(queryToCreate); 线程.睡眠(15000); 返回视图(“搜索”); }//搜索()
  • 点击 button1 按钮后,Search.aspx 网页中的上述脚本运行。

  • 控制器中的 Search() 操作运行时间更长。我模拟 通过放置 Thread.Sleep(15000) 进行测试;在 Search() 操作中。

  • 5 秒。按下提交按钮后,上面的 jQuery 脚本调用 Home 控制器中的 Refresh() 操作。

公共动作结果刷新() { ViewData["Result"] = DateTime.Now; 返回部分视图(); }
  • Refresh() 渲染这个部分

问题是在 Internet Explorer 8 中只有一个对 /Home/Refresh 的请求; 在 Firefox 3.6.3 中,所有对 /Home/Refresh 的请求都已发出,但网页上不显示任何内容。 Firefox 的另一个问题是对 /Home/Refresh 的请求是每秒而不是每 5 秒发出的。
我注意到,在我清除 Firefox 缓存后,脚本在第一次按下 button1 时运行良好,但在那之后它就不起作用了。

如果您有有用的建议,我将不胜感激。

【问题讨论】:

    标签: jquery caching asp.net-mvc-2


    【解决方案1】:

    现在这是一个老问题了。但我遇到了一个我认为与缓存有关的问题,但后来证明是其他问题,我认为有人可能会在某个时候发现它有用。

    我有一套类似这样的例程

    1. MAIN PAGE 通过 .load 调用 SUB PAGE。 SUB PAGE 有数据输入表 以及用于启动 SQL PAGE 以执行相关 sql 的超链接

    2. 以下数据进入 SUB PAGE (通过主页),点击超链接 使用 SQL PAGE 更新数据库,然后刷新 包含 SUB PAGE 的 MAIN PAGE div

    嗯......几个小时我一直在输入数据,然后单击相关链接才发现主页面 div 有时会刷新,有时没有。 F5 总是有效。所以我很确定我有缓存问题。所以我停止使用 .load 并开始使用 .ajax,使用“缓存:假”。我可以看到 .ajax 现在适当地随机化了 get url,但我的 MAIN PAGE div 仍然没有刷新。我确定我遇到了缓存问题...

    但我没有。

    使用 Google Chrome 的开发工具 - 我可以看到有时我的 jQuery 例程正在做它应该做的事情,即

    a) 点击SUB PAGE;执行 SQL PAGE;刷新 MAIN PAGE div

    有时事情就是这样发生的……

    b) 点击SUB PAGE;刷新 MAIN PAGE div;执行 SQL PAGE

    我的代码是为了执行 a) 而编写的,但是因为 SQL PAGE 需要一段时间才能执行,所以 b) 确实发生了。 b) 很糟糕 - 我的 MAIN PAGE div 实际上正在刷新,但更新我的数据表的 SQL 在刷新之前没有执行。

    一旦我意识到这一点,修复就很容易了。使用 .ajax,我实现了以下逻辑:

    i) 点击SUB PAGE ii) 执行 SQL PAGE iii) 以成功执行 SQL PAGE 为条件(使用 .ajax 中的 'success:' 选项),然后刷新包含 SUB PAGE 的 MAIN PAGE div iv) 我把'cache: false'留在原地,以防万一

    此修复对我的代码 100% 有效

    因此,如果您想弄清楚为什么缓存不会关闭,请确保您确实遇到了缓存问题,而不是我上面描述的问题。

    祝你好运

    【讨论】:

      【解决方案2】:

      您可以通过在 GET 参数中添加时间戳来更改您请求的 URL:

      function refreshResult()
      {
        jQuery("#divResult").load("/Home/Refresh?"+(+new Date()));
      }
      

      这应该忽略浏览器缓存(因为 url 每次都在变化)。当然 - 这就是在 ajax 请求上将 jQuery cache 参数设置为 false 所做的事情,我只是不能 100% 确定 .load() 会使用该设置。

      【讨论】:

        【解决方案3】:

        任何浏览器 ajax 处理。从不缓存。

        // Global Vars
        var ajaxRefreshCount = 0;
        var ajaxRequestsCount = 0;
        
        // Call this function for the ajax request
        function ajaxRequest(name)
        {
            ajaxRefreshCount++;
            ajaxRequestsCount++;
            var reqAjax = jQuery.get("/?ajax=" + name + "&r="+ajaxRefreshCount+"&s="+new Date().getTime(), function (data) { ajaxCallback(data, name)} );
        }
        
        function ajaxCallback(data, ajaxRequestName)
        {
            ajaxRequestsCount--;
        
                // Your Stuff
                if (ajaxRequestName == "home_refresh")
                    jQuery("#divResult").html(data);
        
            if (ajaxRequestsCount == 0) ajaxFullyLoaded();
        }
        
        function ajaxFullyLoaded()
        {
            // Execute when all ajax requests where processed
        }
        
        // Example for home refresh
        ajaxRequest("home_refresh");
        

        【讨论】:

          【解决方案4】:

          IE8 的问题可能是 IE 缓存了类似的请求,但我不太熟悉 JQueries 内部是否处理这个问题,解决方案可能是添加一个随机 get var。

          【讨论】:

          • jQuery("#divResult").load("/Home/Refresh?"+Math.floor(Math.random()*100000000));例如
          • 它在清除网络浏览器缓存后第一次工作(在 IE8 和 Firefox 中),但随后的提交不起作用 - 每秒而不是每 5 秒发出对 /Home/Refresh 的请求,并且什么都没有显示在网页上。
          • 对 /Home/Refresh 的后续请求使用 cookie ASP.NET_SessionId=cnn0mffzalceg2l5b3thztw0。我禁用了缓存 Cache-Control: no-cache, no-store, must-revalidate Pragma: no-cache Expires: -1
          • 在你的 javascript 中使用 jquery.ajaxSetup({ cache: false }) 来防止浏览器缓存响应。
          • 我遇到了同样的问题,按照 Tomh 的建议做了,但使用了时间戳。例如jQuery.ajax("somepage.php",{PARAM_ONE: param1, PARAM_TWO: param2, RANDOM_STRING: new Date().getTime()}, function(data) { ...});
          【解决方案5】:

          我找到了解决办法,我换了

          <% using (Html.BeginForm()) {%>
          

          <% using (Ajax.BeginForm(null)) {%>
          

          【讨论】:

            猜你喜欢
            • 2013-11-05
            • 2016-03-07
            • 1970-01-01
            • 2018-05-21
            • 1970-01-01
            • 2011-05-20
            • 2012-10-18
            • 2017-08-14
            • 1970-01-01
            相关资源
            最近更新 更多