【问题标题】:jQuery "Microsoft JScript runtime error: Object expected"jQuery“Microsoft JScript 运行时错误:预期对象”
【发布时间】:2011-02-24 08:50:00
【问题描述】:

我的以下代码似乎根本不起作用:(我不断收到:

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>

【问题讨论】:

    标签: c# jquery javascript


    【解决方案1】:

    试试这个:

    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 - 不。我敢肯定,这里的每个人都曾一度被困在这一点上! :o)
    • 是的,不知道当作为字符串传递时,它必须定义为全局:O
    【解决方案2】:

    像这样更改您的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 - 你是说它在超时后根本没有被调用,还是只有一次?另外,是否有任何 javascript 错误?
    • @Nick 现在它似乎只中断了一次。所以不是在超时之后。似乎在超时之后至少有一次,但现在不是了。不,我没有从调试器中得到任何 js 错误。编辑:注意到它在 Firefox 中按预期工作,但在 IE8 中没有
    • @Oskar - 你有我可以点击测试的示例页面吗?
    • @Oskar - 如果没有看到它,我将无能为力,但是我建议在页面上查看源代码,然后在此处验证它:validator.w3.org 以确保没有 HTML 错误...这通常会导致 IE 崩溃。不同的浏览器会在不同的点停止使用无效的 HTML,如果有差异,肯定需要检查。
    猜你喜欢
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多