jQuery“Microsoft JScript运行时错误:对象预期”

时间:2010-05-26 19:53:01

标签: c# jquery javascript

我有以下代码似乎根本不起作用:(我一直得到:

Microsoft JScript runtime error: Object expected

超时完成时似乎发生错误。因此,如果我将超时提高10秒,则错误持续10秒。

我希望能够在线更新在线异常的朋友数量。该数字显示如下:

<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>

2 个答案:

答案 0 :(得分:3)

试试这个:

window.setTimeout(UpdateFriendsOnline, 1000);

如果在全局命名空间中定义了该函数,那么您所使用的版本将会起作用。

这样,你传入一个对函数的本地引用,它将每秒调用一次。


修改

如果您需要在新请求开始之前取消之前的请求,您可以执行以下操作:

<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>

答案 1 :(得分:3)

像这样更改setTimeout()

window.setTimeout(UpdateFriendsOnline, 1000);

目前你的函数在document.ready之外是不可用的,所以它不能作为全局函数访问,它将字符串作为字符串传递给它试图访问它。作为一般规则,永远不要永远传递setTimeout()一个字符串,如果你可以避免它...它会导致像这种情况的问题,我想不出一个例子(如果因为它是一个字符串而变得更好。

另外,我建议你在收到回复时解雇它,否则你会开始排队重叠ajax请求,你可以通过调整你的函数来做到这一点:

function UpdateFriendsOnline() {
  $.get("/Account/GetFriendsOnline", function(data) {
    $("#friendsOnline").html("(" + data + ")");
    window.setTimeout(UpdateFriendsOnline, 1000);
  });
}