2009-11-11 103 views
0

这个问题看起来很奇怪。我有一个AJAX帮助函数在一个相同的aspx文件和onreadystatechange事件是这样处理的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) 

而且回调函数suceesfully每次叫状态改变后,但我不能引用xmlhttp变量。其总是未定义的

虽然它会在AJaxhelper环境中执行,但它不是。

任何人都可以calrify我如何解决这个

回答

2

不过,我觉得它会在AJaxhelper上下文中执行,但它不是。

否。JavaScript是词汇范围的。一旦完成功能GetValue,本地变量xmlhttp不再可访问。如果功能范围内没有保留对xmlhttp的引用的关闭,则在此情况下不存在,变量xmlhttp将永远消失。

您可能希望有一个封闭保留xmlhttpGetValue并把它传递给回调函数:

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

或者你可以将对象分配给像this.xmlhttp一个成员变量,在那里将是其他功能可见物体内部和外部。

PS。还告诫,JavaScript是大小写敏感的:

变种XML ħ TTP

+0

感谢bobince为UR响应。有疑问。 “aSyncfunction.apply(this)”不会工作? – RameshVel 2009-11-11 12:13:56

+0

如果'this'是正确的,它将起作用。如果你已经通过从其所有者对象中提取方法并将其传递给'onsomething'事件处理程序或'Timeout'来丢失对象引用,'this'将不会是你所期望的,并将它传递给函数将不会做任何好事。 – bobince 2009-11-11 12:19:07