2010-02-04 182 views
1

我使用的是Asp.net MVC,我希望我的部分视图在间隔时间内刷新,直到我做出不相关的Ajax请求,然后停止。在Ajax请求后setInterval停止

下面是一些简化的剪辑来说明问题。

在AjaxRefresh.js

function ajaxRefresh() 
{ 
    var f = $("#AjaxForm"); 
    $("#AjaxLoading").show(); 
    $.post(f.attr("action"), f.serialize(), function (context) { 
     $("#AjaxDiv").html(context); 
     $("#AjaxLoading").hide(); 
    }); 
} 
setInterval(ajaxRefresh, 1000); 

中的Index.aspx:

<script type="text/javascript" src="../../Scripts/AjaxRefresh.js"></script> 
<div id="AjaxDiv"> 
    <% Html.RenderPartial("Computers", Model, ViewData); %> 
</div> 

而这Computers.ascx:

<% Ajax.BeginForm("Index", new { groupName = Model.Name }, new AjaxOptions() { HttpMethod = "Post", LoadingElementId = "AjaxLoading", UpdateTargetId = "AjaxDiv" }, new { id = "AjaxForm" }); Html.EndForm();%> 

<%= Ajax.ActionLink("Send", "Index", new { groupName = Model.Name, data="blah" }, 
     new AjaxOptions() { HttpMethod="Post", LoadingElementId="AjaxLoading", UpdateTargetId="AjaxDiv" }) %> 

如果单击 “发送” 链接,一切仍然有效,但页面会自动刷新。 我试过订阅ajax事件,但是Sys.WebForms.PageRequestManager.getInstance()是未定义的。

+0

我与setInterval有完全相同的问题。我已经尝试过使用setTimeout,就像你没有运气一样。我的setInterval正在调用一个执行POST的函数,每次都能正常工作,直到我触发一个执行不同POST的单击事件时......第二个POST触发时,setInterval停止。你有没有找到一种方法来使这个工作? – Dragn1821 2011-09-09 14:30:55

回答

3

我不知道为什么会发生这种情况,但过去使用jQuery Ajax刷新和setInterval时遇到过类似的问题。最后,我切换到重复setTimeout和没有任何问题:

function onLoad() { 
    setTimeout(ajaxRefresh, 1000); 
} 

function ajaxRefresh() 
{ 
    var f = $("#AjaxForm"); 
    $("#AjaxLoading").show(); 
    $.post(f.attr("action"), f.serialize(), function (context) { 
     $("#AjaxDiv").html(context); 
     $("#AjaxLoading").hide(); 
    }); 
    setTimeout(ajaxRefresh, 1000); 
} 
+0

试过了,它仍然停止。 – 2010-02-05 03:44:05

+0

嗯...一定是一些奇怪的事情与.NET的东西,我不知道。 – 2010-02-05 04:07:59

1

尝试添加一点随机性到您发布的AJAX请求的URL。类似于$.post(f.attr("action")+"?"+Math.random(), ...)。我从来没有想过为什么这会起作用,但它确实(有时)。可能是因为你阻止浏览器使用AJAX响应的缓存结果。

+0

我有一个加载动画,显示它是否尝试。计时器停止时加载动画停止。 – 2010-02-05 03:44:42

0

一些愚蠢的问题......你的浏览器中是否启用了Java脚本调试功能?

我使你在我的示例应用程序提供的相同的例子,它不工作,直到我加入以下脚本的Site.Master:

<script src="../../Scripts/jquery.js" type="text/javascript" ></script> 
<script src="../../Scripts/MicrosoftAjax.debug.js" type="text/javascript" ></script> 
<script src="../../Scripts/MicrosoftMvcAjax.debug.js" type="text/javascript" ></script> 

如果这没有帮助,请检查什么样的当您单击发送时您从索引方法得到的结果。它是部分视图还是常规视图?如果有规律的话,你正在使用干净的html擦除整个页面(即使没有文档)。

如果这仍然没有帮助,这里是我的示例应用程序,您的示例正在工作(至少我如何理解它)。

http://www.sendspace.com/file/gk2qro

+0

仍然没有解决任何问题。是的,这是一个局部的观点。 – 2010-02-07 20:05:38

+0

您是否尝试从上面的链接运行示例代码? – maciejgren 2010-02-08 18:47:30

0

如果您AjaxRefresh.js刚刚代码,你向我们展示了,你可以使用此代码。当浏览器调用.js时,它将开始运行。

var ajax = { 

    init: function() { 
     ajaxRefresh(); 
     setTimeout(init, 1000); 
    } 

    ajaxRefresh: function() 
    { 
     var f = $("#AjaxForm"); 
     $("#AjaxLoading").show(); 
     $.post(f.attr("action"), f.serialize(), function (context) { 
      $("#AjaxDiv").html(context); 
      $("#AjaxLoading").hide(); 
     }); 
    } 
} 
ajax.init(); 
2

我不会用setInterval来更新内容,如果内容需要超过1秒钟加载,你就必须在队列中的多个请求..

使用的setTimeout后请求完成

function sendRequest(){ 
    $.ajax({ 
     /** your post data code **/ 
     complete : function(xhr, status){ 
         setTimeout('sendRequest',1000); 
       } 
    }); 
} 

这样第二个请求将不会在第一个请求完成之前完成。这也应该可以解决你的问题。

0

使用匿名函数包装ajaxRefresh并用圆括号调用它适用于我。 所以你的第二行代码就像setInterval(function() { ajaxRefresh() }, 1000)

我也不明白。

0

我刚刚用setInterval处理了同样类型的问题。我做了什么来使它继续刷新是在10次请求(间隔发射)之后,清除间隔计时器并再次创建它。有效地重新启动它。