Я имею ниже кода, который, кажется, не работает вообще :( Я продолжаю добираться:
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>
Измените setTimeout()
следующим образом:
window.setTimeout(UpdateFriendsOnline, 1000);
В настоящее время ваша функция недоступна за пределами document.ready
, поэтому она недоступна как глобальная функция, а передача ее как строки пытается получить к ней доступ. Как общее правило, никогда никогда не передавайте setTimeout()
строку, если вы можете этого избежать... это может вызвать проблемы, как в этом случае, и я не могу придумать пример (который, если его можно избежать), стал бы лучше, если бы это была строка.
Кроме того, я предлагаю срабатывать, когда вы получаете ответ, иначе вы начнете ставить в очередь перекрывающиеся ajax-запросы, вы можете сделать это, настроив свою функцию так:
function UpdateFriendsOnline() {
$.get("/Account/GetFriendsOnline", function(data) {
$("#friendsOnline").html("(" + data + ")");
window.setTimeout(UpdateFriendsOnline, 1000);
});
}
Попробуйте так:
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>