代码之家  ›  专栏  ›  技术社区  ›  Oskar Kjellin

jquery“Microsoft JScript运行时错误:需要对象”

  •  7
  • Oskar Kjellin  · 技术社区  · 15 年前

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

    Microsoft JScript runtime error: Object expected
    

    超时完成后似乎会出现错误。因此,如果我将超时时间提高10秒,那么错误将再保持10秒。

    我想能够更新的朋友数在线异步。数字显示为以下HTML:

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

    friends部分在第一次运行时设置,但当超时调用时,它不会再次启动。另外,我看不到错误发生在哪一行,因为如果我想突破错误,它只显示“没有源代码”等。

    下面的代码是我正在使用的代码。谢谢!

    <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 回复  |  直到 15 年前
        1
  •  3
  •   Nick Craver    15 年前

    改变你 setTimeout() 这样地:

    window.setTimeout(UpdateFriendsOnline, 1000);
    

    当前您的功能在 document.ready ,因此它不能作为全局函数进行访问,而将其作为字符串传递则试图将其作为访问。一般来说,永远不要 曾经 通过 设置TimeTo() 一个字符串,如果你能避免它……它会导致像这种情况下的问题,我想不出一个例子(如果可以避免的话)是通过它作为一个字符串而变得更好。

    另外,我建议在您得到响应时触发它,否则您将开始排队处理重叠的Ajax请求,您可以通过将函数调整为:

    function UpdateFriendsOnline() {
      $.get("/Account/GetFriendsOnline", function(data) {
        $("#friendsOnline").html("(" + data + ")");
        window.setTimeout(UpdateFriendsOnline, 1000);
      });
    }
    
        2
  •  3
  •   user113716    15 年前

    试试这个:

    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>