2012-08-28 70 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