jQuery “ошибка периода выполнения Microsoft JScript: Object ожидал”

Я имею ниже кода, который, кажется, не работает вообще :( Я продолжаю добираться:

Microsoft JScript runtime error: Object expected

Ошибка, кажется, происходит, когда тайм-аут сделан. Таким образом, если я повышаю тайм-аут с 10 секундами, ошибка содержит в течение еще 10 секунд.

Я хочу смочь обновить число друзей, онлайн асинхронных. Число показывают со следующим HTML:

<a href="" id="showChat" >Friends online <strong id="friendsOnline">(?)</strong></a>

Друзья часть установлена на первом показе, но когда тайм-аут отзывает его, не стреляют снова. Кроме того, я не вижу, на котором выравнивают ошибку, происходит, потому что, если я хочу повредиться на ошибке, она просто не показывает "исходного кода" и т.д.

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

<script src="http://ajax.microsoft.com/ajax/jquery/jquery-1.3.2.js" type="text/javascript"></script> 
<script src='/Scripts/MicrosoftAjax.js' type="text/javascript"></script> 
<script src='/Scripts/MicrosoftMvcAjax.js' type="text/javascript"></script> 
<script src='/Scripts/jquery.autocomplete.js' type="text/javascript"></script>

<script type="text/javascript"> 
$(document).ready(function() {
    UpdateFriendsOnline();
    function UpdateFriendsOnline() {
        window.setTimeout("UpdateFriendsOnline()", 1000);
        $.get("/Account/GetFriendsOnline", function(data) {
            $("#friendsOnline").html("(" + data + ")");

        });
    }
});
</script>
7
задан Oskar Kjellin 26 May 2010 в 19:53
поделиться

2 ответа

Измените setTimeout() следующим образом:

window.setTimeout(UpdateFriendsOnline, 1000);

В настоящее время ваша функция недоступна за пределами document.ready, поэтому она недоступна как глобальная функция, а передача ее как строки пытается получить к ней доступ. Как общее правило, никогда никогда не передавайте setTimeout() строку, если вы можете этого избежать... это может вызвать проблемы, как в этом случае, и я не могу придумать пример (который, если его можно избежать), стал бы лучше, если бы это была строка.

Кроме того, я предлагаю срабатывать, когда вы получаете ответ, иначе вы начнете ставить в очередь перекрывающиеся ajax-запросы, вы можете сделать это, настроив свою функцию так:

function UpdateFriendsOnline() {
  $.get("/Account/GetFriendsOnline", function(data) {
    $("#friendsOnline").html("(" + data + ")");
    window.setTimeout(UpdateFriendsOnline, 1000);
  });
}
3
ответ дан 7 December 2019 в 09:57
поделиться

Попробуйте так:

window.setTimeout(UpdateFriendsOnline, 1000);

Версия, которая у вас была, работала бы, если бы функция была определена в глобальном пространстве имен.

Таким образом, вы передаете локальную ссылку на функцию, которая будет вызываться каждую секунду.


EDIT:

Если вам нужно отменить предыдущий запрос до начала нового, вы можете сделать что-то вроде этого:

<script type="text/javascript"> 
$(document).ready(function() {
    var request;   // Stores XMLHTTPRequest object
    UpdateFriendsOnline();
    function UpdateFriendsOnline() {
        if(request) request.abort();  // Abort current request if there is one

        window.setTimeout(UpdateFriendsOnline, 1000);

           // Store new XMLHTTPRequest object
        request = $.get("/Account/GetFriendsOnline", function(data) {
            request = null;  // Clear request object upon success
            $("#friendsOnline").html("(" + data + ")");
        });
    }
});
</script>
3
ответ дан 7 December 2019 в 09:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: