2013-02-28 112 views
1

我需要一個純JavaScript函數(對不起,沒有jQuery),它將返回成功的AJAX調用的響應。下面是到目前爲止,我已經得到了功能,我想從響應的HTML返回HTMLobjectJavaScript函數返回AJAX響應(無jQuery)?

function getHtml(url) { 
    var httpRequest; 
    var HTMLobject; 

    if (window.XMLHttpRequest) { 
     httpRequest = new XMLHttpRequest(); 
    } else if (window.ActiveXObject) { 
     try { 
      httpRequest = new ActiveXObject("Msxml2.XMLHTTP"); 
     } catch (e) { 
      try { 
       httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); 
      } catch (e) {} 
     } 
    } 

    if (!httpRequest) { 
     console.error('Cannot create an XMLHTTP instance'); 
     return false; 
    } 

    httpRequest.onreadystatechange = function() { 
     if (httpRequest.readyState === 4) { 
      if (httpRequest.status === 200) { 
       // OK, turn the string into HTML. 
       var div = document.createElement('div'); 
       div.innerHTML = httpRequest.responseText; 
       // Assign the converted HTML to HTMLobject. 
       HTMLobject = div.childNodes[0]; 
      } else { 
       console.debug('There was a problem with the request.'); 
      } 
     } 
    }; 

    httpRequest.open('GET', url); 
    httpRequest.send(); 

    return HTMLobject; 
} 

我知道爲什麼HTMLobject回報不確定,但我需要它的工作。有沒有辦法讓AJAX完成後函數返回對象?

+0

可能重複[如何返回AJAX響應文本?](http://stackoverflow.com/questions/1225667/how-to-return-ajax-response-text) – Quentin 2013-02-28 11:00:02

+0

@Quentin我不想使用任何庫。 – igneosaur 2013-02-28 11:29:19

+0

無論您是否使用圖書館,原則都是一樣的。 – Quentin 2013-02-28 11:47:36

回答

1

不,解決方案是這樣的情況是使用回調函數。

例如:的

getHtml('url', function(HTMLobject){ 
    //Do something with HTMLobject 
}); 

代替

var HTMLobject = getHtml('url'); 
//Do something with HTMLobject 

發出請求async: false是一個糟糕的主意,因爲它會阻止該頁面,直到請求是:

function getHtml(url, callback) { 
    .... 
    .... 
    callback(HTMLobject); //instead of returning the HTMLobject, call a callback function as pass the `HTMLobject` as a argument. 
} 

用法完成(UI不會重繪,UI交互不會發生)

+0

啊,當然。感謝您對同步選項的解釋,歡呼! – igneosaur 2013-02-28 12:04:55

1

化妝的要求同步,只是做如下

httpRequest.open('GET', url,false);//false make request synchronous 
httpRequest.send(); 

「假」選項說的調用是同步的,這意味着該代碼將掛起,直到一個響應返回的