2009-11-11 60 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