代码之家  ›  专栏  ›  技术社区  ›  RameshVel

ajax调用中的onreadyStateChange事件问题?

  •  0
  • RameshVel  · 技术社区  · 15 年前

    这个问题似乎很奇怪。我在同一个ASPX文件中有一个Ajax助手函数,onreadyStateChange事件的处理方式如下

          xmlhttp.onreadystatechange = function(){
                 if (xmlhttp.readyState == 4)
                       //do some opp
          }
    

    这个很好用。我可以在回调中读取xmlhttp值。

    而我 已将Ajax帮助程序方法移动到添加JS文件中 . 我创造了一个类似这样的方法

       function AjaxHelper() {
           this.GetValue = function(sData, sMethod, assembly, json, aSyncfunction) {
              var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    
             if (typeof(aSyncfunction) != "undefined" && aSyncfunction != null) {
                xmlhttp.onreadystatechange = aSyncfunction
             }
    
             //Ajax open and send code here
    
           }
       }
    

    现在,我在ASPX文件中创建了一个回调函数,并调用了ajaxhelper.getValue()函数

         var callback=function(){
            if (xmlhttp.readyState == 4)
                       //do some opp
    
         }
    
         AjaxHelper.GetValue("test","getTest()","UIhelper","",callback) 
    

    每次状态改变后都会成功地调用回调函数,但我不能引用xmlhttp变量。 它总是未定义的 .

    我认为它将在Ajaxhelper上下文中执行,但它不是。

    有人能批评我怎么解决这个问题吗

    1 回复  |  直到 15 年前
        1
  •  2
  •   bobince    15 年前

    我认为它将在Ajaxhelper上下文中执行,但它不是。

    不。javascript在词汇范围内。完成功能后 GetValue ,局部变量 xmlhttp 无法再访问。如果函数范围内没有闭包,则保留对 XML HTTP ,在本例中没有,变量 XMLHTTP 永远不见了。

    你可能想保留一个关闭 XML HTTP 在里面 方法 并将其传递给回调函数:

    if (aSyncfunction) {
        xmlhttp.onreadystatechange= function() {
            aSyncfunction(xmlhttp);
        };
    }
    

    或者可以将对象赋给成员变量,比如 this.xmlhttp 在该对象内外的其他函数都可以看到它。

    另外要注意,javascript是区分大小写的:

    VaR XML H __TTP