tags:

views:

444

answers:

2

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>
+3  A: 

Try this:

window.setTimeout(UpdateFriendsOnline, 1000);

The version you had would have worked if the function was defined in the global namespace.

This way, you're passing in a local reference to the function, which will get called every second.


EDIT:

If you need to cancel the previous request before the new one starts, you can do something like this:

<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>
patrick dw
Thank you both, that seemed to work! :) made me feel stupid :(
Oskar Kjellin
@Oskar Kjellin - Nah. I'm sure everyone here got stuck on that at one time or another! :o)
patrick dw
@patrick Yeah, didn't know that when passing as a string it had to be defined as global :O
Oskar Kjellin
+3  A: 

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);
  });
}
Nick Craver
@Nick Thank you. I modified my code to match that one now. Do you have any idea why my request is only called once though? Does not seem to update every second :( If I set a breakpoint in my controller I only hit it once.
Oskar Kjellin
@Oskar - Are you saying it's not getting called after the timeout at all, or only once? Also, are there any javascript errors?
Nick Craver
@Nick Now it seems to break just once. So not after the timeout. Seemed to be at least once after the timeout before, but not anymore. No, I do not get any js-errors from the debugger. Edit: noticed that it works just as intended in firefox, but not IE8
Oskar Kjellin
@Oskar - You have an example page I can hit to test?
Nick Craver
@Nick unfortunately no :(
Oskar Kjellin
@Oskar - I can't help a lot without seeing it, however I would advise viewing source on the page then validating it here: http://validator.w3.org/ to make sure there are no HTML errors...this often causes IE to break down. Different browsers stop at different points with invalid HTML, if there's a difference it's definitely something to check.
Nick Craver
@Nick Thanks. I will try that. If I cannot fix it I'll open a new question for it!
Oskar Kjellin
@Nick I solved it. Turned out that IE cached the result. For those of you who have the same issue, check this link: http://www.sitecrafting.com/blog/ajax-ie-caching-issues/
Oskar Kjellin
@Oskar - Ahh yes, IE likes to cache like the interwebs will collapse at any moment for some reason, glad you got it worked out!
Nick Craver