Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jQuery "Microsoft JScript runtime error: Object expected"

I have the below code that does not seem to work at all :( I keep getting:

Microsoft JScript runtime error: Object expected

The error seems to occur when the timeout is done. So if I raise the timeout with 10 seconds the error holds for another 10 seconds.

I want to be able to update the number of friends online async. The number is shown with the following html:

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

The friends part is set at the first run, but when the timeout calls back it does not fire again. Also, I cannot see on which line the error occurs because if I want to break on the error it just shows "no source code" etc.

The code below is the code I'm using. Thanks!

<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>
like image 714
Oskar Kjellin Avatar asked May 26 '10 19:05

Oskar Kjellin


1 Answers

Change your setTimeout() like this:

window.setTimeout(UpdateFriendsOnline, 1000);

Currently your function isn't available outside the document.ready, so it's not accessible as a global function, which passing it as a string is trying to access it as. As a general rule, never ever pass setTimeout() a string if you can avoid it...it can cause problems like this case, and I can't think of an example (that if avoidable) is made better by it being a string.

Also, I suggest firing it when you get the response back, otherwise you'll start queuing up overlapping ajax requests, you can do that by adjusting your function to this:

function UpdateFriendsOnline() {
  $.get("/Account/GetFriendsOnline", function(data) {
    $("#friendsOnline").html("(" + data + ")");
    window.setTimeout(UpdateFriendsOnline, 1000);
  });
}
like image 114
Nick Craver Avatar answered Oct 07 '22 18:10

Nick Craver