2012-08-28 124 views
3

我在我的網站上使用了大量的AJAX和XML Http Requests。對於看似隨意的幾個AJAX調用,我不能讓onreadystatechange函數中的所有javascript都正確執行,除非我有一個警報調用,我猜測它暫停足夠的執行,以便完成PHP腳本的運行服務器。下面是我在說什麼的例子:AJAX功能無法正常工作

的Javascript

xmlHttp=getXMLHttp(); //function returns an xmlhttp object to use 
//get parameters ready 
param="id=5" 
xmlHttp.onreadystatechange=function(){ 
    if(xmlHttp.readyState==4){ 
     s=xmlHttp.responseText; 
     var myJson = eval("("+s+")"); 
     document.getElementById('Elem1').value=myJson.Result1; 
     document.getElementById('Elem2').value=myJson.Result2; 
     triggerEvent(document.getElementById('Elem3'),'onblur'); 
     document.getElementById('Elem4').value=myJson.Result3; 
     document.getElementById('Elem5').value=myJson.Result4 
     var sel = document.getElementById('Elem6'); 
     var i; 
     for(i=0;i<sel.length;++i){ 
      if(sel.options[i].value==myJson.Result5){ 
       sel.selectedIndex = i; 
       break; 
      } 
     } 
     document.getElementById('MfgCustNum').value=myJson.Result6; 
     document.getElementById('MfgOrderNum').value=myJson.Result7; 
     document.getElementById('OrderDatePicker').value=myJson.Result8; 
     document.getElementById('ShipDatePicker').value=myJson.Result9; 
     document.getElementById('CancelDatePicker').value=myJson.Result10; 
     document.getElementById('PO Number').value=myJson.Result11; 
     //for some reason, the following 2 lines are where I'm having issues without an alert box 
document.getElementById('NewElement').value=myJson.Result12; 
    document.getElementById('NewElement2').value=myJson.Result13; 
//everything else loads properly 
     sel = document.getElementById('SelectBox1') 
     for(i=0;i<sel.length;++i){ 
      if(sel.options[i].value==myJson.Result14){ 
       sel.selectedIndex = i; 
       break; 
      } 
     } 
     sel = document.getElementById('SelectBox2') 
     for(i=0;i<sel.length;++i){ 
      if(sel.options[i].value==myJson.Result15){ 
       sel.selectedIndex = i; 
       break; 
      } 
     } 
     sel = document.getElementById('SelectBox3') 
     for(i=0;i<sel.length;++i){ 
      if(sel.options[i].value==myJson.Result16){ 
       sel.selectedIndex = i; 
       break; 
      } 
     } 
     sel = document.getElementById('SelectBox4') 
     for(i=0;i<sel.length;++i){ 
      if(sel.options[i].value==myJson.Result17){ 
       sel.selectedIndex = i; 
       break; 
      } 
     } 
    } 
} 
xmlHttp.open("POST","../ServerCall.php",true); 
xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); 
xmlHttp.send(params); 

我跑PHP腳本是被回顯爲JSON陣列

$dc->connect(); 
    $query = "SELECT COLUMNS FROM TABLE" 
    $res = $dc->queryDb($query); 
    if(!$res){ 
     exit(); 
    } 
    $ary = $dc->resultsToArray($res); 
    $JSON_ARRAY=array(); 
    foreach($ary[0] as $key=>$value){ 
     if(!is_numeric($key)) 
      $JSON_ARRAY[$key]=$value; 
    } 
    echo json_encode($JSON_ARRAY); 
一個數據庫的簡單查詢

這對我來說已經成爲一個相當大的問題,因爲它現在發生在我的代碼的3或4個不同部分,但在響應文本中顯示一個警告對話框,顯示所有內容都正常運行。我試着同步而不是異步地運行AJAX調用,但它沒有幫助。我也嘗試過使用settimeout來延遲運行一兩秒的代碼,但是我將結果與該結果混合在一起,並且我寧願不必爲要運行的腳本設置特定的延遲。

編輯: 回答一些註釋中的問題: 對於這個代碼片段,這些問題與以下兩行:

document.getElementById('NewElement').value=myJson.Result12; 
document.getElementById('NewElement2').value=myJson.Result13; 

,如果我把一個警告框,該行前右獲取myJson.Result12的文本,元素會在我的頁面上正確填寫。沒有它,它們被留空,並且在Firefox的錯誤控制檯中看不到任何錯誤。

此代碼正在運行onclick。我正在使用DataTables,當有人在我的表格中雙擊一行時,頁面會填充內容。同樣,除了我今天早些時候添加的2個新元素之外,一切工作都正常。更重要的是更多關於這是如何在我的代碼中反覆出現的問題。另外,我試過jQuery的AJAX調用,但沒有太多的運氣,它的大部分代碼已經使用xmlHttp編寫,只有JS。

+2

不是你的問題的答案,但一旦你開始進入複雜的AJAX功能,你真的應該看看使用像jQuery這樣的框架來讓你的生活更輕鬆。那麼哪部分代碼沒有執行? –

+0

你能更具體一點,什麼代碼不工作,你在哪裏alert()的? Readystate == 4表示所有數據都可用。 – BadFeelingAboutThis

+2

您可能想看看使用jQuery並使用DOM Ready模型而不是onreadystatechange。 (我不熟悉,所以這可能不是問題)。此外,它看起來像是在這裏遇到了一個非常簡單的競爭條件。把這些放在jQuery的ajax/post函數的成功調用中,你會沒事的。 – DaOgre

回答

0

所以,現在,數據似乎加載得很好,沒有提示框來暫停腳本。我不確定現在與以前有什麼不同,但我會繼續嘗試重現錯誤。我想知道如果問題是基於我使用的瀏覽器或計算機,而不是代碼本身工作不正常。或者,也許數據庫響應速度較慢,導致一些問題。 FWIW,我試圖接收的列,雖然沒有充足的數據,但是我嘗試選擇的列的最大大小是最大的。

感謝大家的幫助。在評論中使用AJAX肯定有很多好的建議。

1

可能的原因;

您應該從onload處理程序執行您的AJAX請求,否則您的頁面在獲得響應時可能不會完全加載。如果NewElement和NewElement2在您嘗試更新它們時未加載,您的腳本將不起作用。

警報將延遲足夠的腳本讓頁面完成加載,允許元素在腳本到達該點之前存在。

+0

查看我更新的帖子。 DOM應該已經加載,因爲AJAX請求是從onclick事件中調用的 – gdawgrancid