AJAX调用中的onreadystatechange事件问题?

时间:2009-11-11 10:46:02

标签: javascript ajax

问题似乎很奇怪。我在同一个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 个答案:

答案 0 :(得分:2)

  

我虽然它将在AJaxhelper上下文中执行,但它不是。

没有。 JavaScript是词法范围的。完成函数GetValue后,将无法再访问本地变量xmlhttp。如果函数范围内没有闭包,保留对xmlhttp的引用,就像在这种情况下没有,变量xmlhttp永远消失了。

您可能希望xmlhttp中的闭包保留GetValue并将其传递给回调函数:

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

或者你可以将对象分配给一个成员变量,如this.xmlhttp,它对象内外的其他函数都可以看到。

PS。同样谨慎,JavaScript区分大小写:

  

var xml H ttp