2010-02-04 201 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次請求(間隔發射)之後,清除間隔計時器並再次創建它。有效地重新啓動它。