setInterval останавливается после Ajax-запроса - PullRequest
1 голос
/ 05 февраля 2010

Я использую Asp.net MVC и хочу, чтобы мое частичное представление обновлялось с интервалом, что происходит до тех пор, пока я не сделаю несвязанный запрос Ajax, а затем остановится.

Вот несколько упрощенных примеров, иллюстрирующих проблему.

в 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 () не определен.

Ответы [ 7 ]

3 голосов
/ 05 февраля 2010

Я не уверен, почему это произошло, но в прошлом у меня были похожие проблемы с обновлениями 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);
}
2 голосов
/ 04 августа 2012

Я бы не использовал setInterval для обновления контента, так как если контент загружается более 1 секунды, у вас будет несколько запросов в очереди.

использовать setTimeout после завершения запроса

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

таким образом, второй запрос не будет выполнен до его завершения. и это тоже должно решить твою проблему.

1 голос
/ 05 февраля 2010

Попробуйте добавить немного случайности в URL, где вы отправляете запрос AJAX. Что-то вроде $.post(f.attr("action")+"?"+Math.random(), ...). Я никогда не понимал, почему это работает, но это происходит (иногда). Возможно, потому что вы запрещаете браузеру использовать кэшированный результат для ответа AJAX.

0 голосов
/ 11 октября 2017

Я только что имел дело с этим же типом проблемы с setInterval. Чтобы продолжить обновление, я сделал после десяти запросов (интервальных срабатываний) очистку интервального таймера и создание его заново. Эффективно перезапуская его.

0 голосов
/ 14 июня 2014

Упаковка ajaxRefresh в анонимную функцию и вызов ее в скобках работает для меня. Таким образом, ваша вторая строка кода будет выглядеть как setInterval(function () { ajaxRefresh() }, 1000).

Я тоже не понимаю.

0 голосов
/ 01 августа 2012

Если ваш 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();
0 голосов
/ 06 февраля 2010

Некоторые глупые вопросы ... у вас включена отладка 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>

Если это не поможет, проверьте, какие результаты вы получаете с помощью метода Index, когда нажимаете кнопку Отправить. Это PartialView или обычный вид? если регулярно, вы стираете всю страницу с чистым HTML (даже без документа в нем).

Если это по-прежнему не помогает, вот мой пример приложения, в котором работает ваш пример (по крайней мере, так, как я его понимаю).

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

...