2010-08-06 99 views
1

好吧,我已經到處尋找這個。我正在刪除一些變量聲明,因爲我可以確保我的XMLHttpRequest正在工作。Ajax只返回readyState == 4值

function submit_edit_form() 
{ 
    // id and title are already declared 
    var x = ajax_edit_form_save(id, 'title', title); 
    alert(x); 
} 
function ajax_edit_form_save(id, property, new_value) 
{ 

    if (window.XMLHttpRequest) 
    { 
     xmlhttp = new XMLHttpRequest(); 
    } 
    else 
    { 
     // screw IE5 & IE6 
     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xmlhttp.onreadystatechange = function() 
    { 
     if (xmlhttp.readyState == 4 && xmlhttp.responseText != '') 
     {  
      return xmlhttp.responseText; 
     } 
    } 

    // myURL is already defined. I'm not troubleshooting this part, I know it's working 
    xmlhttp.open("GET", myURL, true); 
    xmlhttp.send(); 
} 

所以,當我打電話submit_edit_form(),它調用ajax_edit_form_save(),我得到 '未定義' 警報。我知道問題是,ajax_edit_form_save()在readyState 1上返回undefined。我抓住我的頭,因爲我只有在readyState == 4時返回。4.我怎樣才能阻止返回值,以便x得到實際responseText的?

回答

3

即使在ajax調用完成之前,您的函數正在返回,因爲它是異步的。你的「onreadystatechange」中的return語句將不會產生任何效果,因爲該值返回給方法「onreadystatechange」的調用方,該方法是XMLHttpRequest對象而不是代碼。

你應該通過一個回調函數來你ajax_edit_form_save被稱爲當readyState爲4

請看下圖:

function ajax_edit_form_save(id, property, new_value, funCallback) // ==> callback function 
{ 

    if (window.XMLHttpRequest) 
    { 
     xmlhttp = new XMLHttpRequest(); 
    } 
    else 
    { 
     // screw IE5 & IE6 
     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xmlhttp.onreadystatechange = function() 
    { 
     if (xmlhttp.readyState == 4 && xmlhttp.responseText != '') 
     {  
      callback(xmlhttp.responseText); // =============> callback function called 
     } 
    } 

    // myURL is already defined. I'm not troubleshooting this part, I know it's working 
    xmlhttp.open("GET", myURL, true); 
    xmlhttp.send(); 
} 

回調函數可以是:

function handleReponse(resp) { 
    // do something with resp 
} 

ajax_edit_form_save("myID", "myProperty", "new value", handleResponse); 
+0

哥們我覺得我愛你。我完全沒有想到這一點。我要檢查一下,我會給你支票。 – 2010-08-06 05:51:47

+0

好的,我完全可以接受並使用它。謝謝! – 2010-08-06 05:59:33

+0

@Adam Tootle歡迎您! – naikus 2010-08-06 06:18:41

0

哪兒了你從哪個文件中得到(x)?我想,你忘了提及URL值。

+1

這不是問題。我知道請求正常工作。我只需要處理返回值。 – 2010-08-06 06:00:42