2011-09-27 39 views
0

雖然開發一個Web應用程序,我很大的使用javascript php和ajax。如何在ajax調用期間運行javascript?

我想打電話給

display_terminal('feedback_viewer','logs/init-raid-log.txt','Init-Raid'); 

建立我的終端和呼叫feed_terminal(),它有它自己的setTimeout()遞歸調用

var url='../edit_initRaid.php'; 
    status_text('Initializing raid-array. Please wait a moment...'); 
    var xmldoc=ajaxPHP2(url,2); 

php文件,什麼也不做更多的

exec("sudo /usr/bin/./init-raid-drives-web.sh"); 

這是我失敗的地方。直到php文件中的exec()返回到php文件並且php文件返回到javascript之後,纔會執行下一行。這並不重要,但我確定它並不是這樣的,因爲最初bash腳本會在2分鐘的時間內執行,並且javascript將成功使用feed_terminal更新html。這不再是這種情況。

alert("javascript has returned from ajax call"); 
    if (xmldoc) { 
      status_text('Raid-array initialized successfully. System will now restart.You must re-login to FDAS-Web.'); 

下面是你的問題

一串代碼最後我的問題是,我怎麼能運行JavaScript的AJAX通話錄音嗎? 或者,也許我的問題應該是,我怎麼能edit_initRaid返回一個xmldoc,而不等待的exec()返回,或者我怎麼能沒有腳本完成的exec()返回?

function initRaidArray(){ 
if (document.getElementById('initRaid_doubleCheck')){ 
    if (document.getElementById('initRaidHideButtonSpot')) 
      document.getElementById('initRaidHideButtonSpot').innerHTML = ''; 

    var spot=document.getElementById('initRaid_doubleCheck'); 
    spot.innerHTML=''; 
    spot.innerHTML='This may take a few moments. Please wait.'; 
} 
    display_terminal('feedback_viewer','logs/init-raid-log.txt','Init-Raid'); 
    var url='../edit_initRaid.php'; 
    status_text('Initializing raid-array. Please wait a moment...'); 
    var xmldoc=ajaxPHP2(url,2); 
alert("javascript has returned from ajax call"); 
    if (xmldoc) { 
      status_text('Raid-array initialized successfully. System will now restart. You must re-login to FDAS-Web.'); 
    } 
} 

其中display_terminal()做兩件事情,建立一個表,並將其添加到頁面,並調用feed_terminal(日誌文件,bigDiv,0)

function feed_terminal(logFile,bigD,lap){ 
    // AJAX 
    bigD.innerHTML = ''; 
    var url='../view_xml_text.php'; 
    /* 
    * lap(0)=clear file , lap(1)=do not clear file 
    */ 
    url+='?logFile='+logFile+'&lap='+lap; 
    var XMLdoc=ajaxPHP2(url,2); 
    var xmlrows = XMLdoc.getElementsByTagName("line"); 

alert("xmlrows.length=="+xmlrows.length); 
    // empty file 
    if (xmlrows.length==0){ 
      var d = document.createElement('div'); 
      var s = document.createElement('span'); 
      s.innerHTML='...'; 
      d.appendChild(s); 
      bigD.appendChild(d); 
    } else { 
      // Parse XML 
      for (var i=0;i<xmlrows.length;i++){ 
        if (xmlrows[i].childNodes[0]){ 
          if (xmlrows[i].childNodes[0].nodeValue){ 
            var d = document.createElement('div'); 
            var s = document.createElement('span'); 

            s.innerHTML=xmlrows[i].childNodes[0].nodeValue; 
            d.appendChild(s); 
            bigD.appendChild(d); 
          } 
        } 
      } 
    } 
    setTimeout(function(){feed_terminal(logFile,bigD,1)},2000); 
} 

,其中最重要的項目是的setTimeout ()調用繼續向PHP文件返回,該文件只返回文件中行的xml。

function ajaxPHP2(url,key) 
{ 
    if (window.XMLHttpRequest) { 
      xml_HTTP=new XMLHttpRequest(); 
      if (xml_HTTP.overrideMimeType) {xml_HTTP.overrideMimeType('text/xml');} 
    } else { xml_HTTP=new ActiveXObject("Microsoft.xml_HTTP"); } 
    xml_HTTP.open("GET",url,false); 
    xml_HTTP.send(null); 
    if (key){return xml_HTTP.responseXML;} 
} 

回答

2

您需要告訴Javascript以異步方式進行XHR調用。

變化

xml_HTTP.open("GET",url,false); 

xml_HTTP.open("GET",url,true); 

但首先,你需要告訴它做一些請求完成(一callback)時:

xmlhttp.onreadystatechange=function() 
    { 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) 
    { 
     alert(xmlhttp.responseText); 
    } 
    } 
xmlhttp.open("GET",url,true); 
xmlhttp.send(); 

一推薦:XHR是一種痛苦。使用類似jQuery's $.ajax()

+0

感謝您的幫助,此工作 –

0

您需要將您的ajax調用設置爲異步。在ajaxPHP2函數中,行xml_HTTP.open("GET", url, false);是導致頁面暫停的原因。 false參數告訴ajax調用使所有其他事情等待它。更改假爲真,所以它看起來是這樣的:

xml_HTTP.open("GET", url, true); 

您可能還需要一個功能附加到onreadystatechange屬性,這樣當Ajax調用返回時,就知道該怎麼做。有關更多信息,請參閱theselinks

+0

感謝您的幫助 –

相關問題