2011-09-27 1 views
0

자바 스크립트 PHP와 아약스를 잘 활용하고있는 웹 앱을 개발하는 동안.ajax 호출 중에 javascript를 실행하는 방법은 무엇입니까?

나는 나의 터미널을 구축하고 자신의 setTimeout() 재귀 호출이있는) (feed_terminal 전화

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); 

아무것도하지 않는 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.'); 

이 질문

에 대한 코드의 무리를하다 결국 내 질문에, 어떻게 아약스 통화 중에 자바 스크립트를 실행할 수 있습니까? 또는 어쩌면 내 질문에 있어야합니다, 어떻게 edit_initRaid xmldoc exec() 반환 할 때까지 기다리지 않고 반환 할 수 또는 어떻게 exec() 스크립트를 완료하지 않고 반환 할 수 있습니까? display_terminal() 두 가지 일을이, 테이블을 구축하고 페이지에 추가하고, feed_terminal 호출

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.'); 
    } 
} 

(로그 파일을 bigDiv, 0)의 가장 중요한 항목은의 setTimeout

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); 
} 

입니다() 호출은 파일의 xml 줄을 반환하는 php 파일에 계속 도달하도록 호출합니다.

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

XavR 호출을 비동기 적으로 수행하도록 Javascript에 지시해야합니다.

변경

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

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

로하지만 먼저, 당신은 요청 (A 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 매개 변수는 아약스 호출에 다른 모든 호출이 대기하도록 지시하고 있습니다. 그것은 다음과 같습니다 있도록 true로 거짓을 변경 :

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

당신은 또한 그것이 무엇을 알고있는 AJAX 호출이 반환 할 때되도록을 onreadystatechange 속성에 함수를 연결해야 할 수도 있습니다.자세한 내용은 theselinks을 참조하십시오.

+0

감사합니다. –