jQuery“Microsoft JScript runtime error: Object expected”

7
我有以下代码,但似乎完全不起作用 :( 我一直收到以下错误信息:
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>
2个回答

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>

谢谢你们俩,看起来好像可以了! :) 让我感觉很愚蠢 :( - Oskar Kjellin
@Oskar Kjellin - 不会的。我相信这里的每个人都曾经卡在那里过!:o) - user113716
是的,当作为字符串传递时,它必须被定义为全局的,我之前不知道 :O - Oskar Kjellin

3

将您的setTimeout()更改为以下内容:

window.setTimeout(UpdateFriendsOnline, 1000);

目前你的函数在 document.ready 之外不可用,因此它无法作为全局函数访问,尝试将其作为字符串传递进行访问。一般来说,如果可以避免,千万不要将字符串传递给 setTimeout(),否则会导致像这个案例中的问题,而且我想不到任何可以通过字符串传递来改善的例子。
此外,我建议在收到响应后立即触发它,否则你将开始排队重叠的 AJAX 请求。你可以通过调整你的函数来实现这个目标:
function UpdateFriendsOnline() {
  $.get("/Account/GetFriendsOnline", function(data) {
    $("#friendsOnline").html("(" + data + ")");
    window.setTimeout(UpdateFriendsOnline, 1000);
  });
}

@Nick 谢谢。我现在已经修改了我的代码以匹配那个代码。你有任何想法为什么我的请求只被调用一次呢?它似乎不会每秒更新:(如果我在我的控制器中设置断点,我只会命中一次。 - Oskar Kjellin
@Oskar - 你是说它在超时后根本没有被调用,还是只调用了一次?此外,是否有任何JavaScript错误? - Nick Craver
@Nick 现在看起来只是出现了一次错误,而不是超时后。之前似乎至少在超时后出现过一次,但现在没有了。不,我没有从调试器中得到任何js错误。编辑:注意到它在Firefox中的表现与预期完全相同,但在IE8中不是这样。 - Oskar Kjellin
@Oskar - 你有一个示例页面可以让我测试吗? - Nick Craver
@Oskar - 没有看到代码,我无法提供太多帮助,但我建议在页面上查看源代码,然后在此处进行验证:http://validator.w3.org/,以确保没有HTML错误...这经常导致IE崩溃。不同的浏览器在遇到无效的HTML时会在不同的点停止,如果有差异,一定要检查一下。 - Nick Craver
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接