我在我的网站上使用了大量的XML Http请求的AJAX技术。然而,有几个看似随机的AJAX调用中,除非我加入一个alert语句以暂停执行并等待服务器PHP脚本运行完毕,否则我的onreadystatechange函数内的所有javascript代码都无法正常执行。以下是具体示例:
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延迟1或2秒钟运行代码,但结果参差不齐,我宁愿不必设置脚本运行的特定延迟时间。
编辑: 回答一些评论中的问题: 对于这个代码片段,问题出现在以下两行中:
document.getElementById('NewElement').value=myJson.Result12;
document.getElementById('NewElement2').value=myJson.Result13;
如果我在那行代码之前放置一个警告框以获取myJson.Result12的文本,页面上的元素就会被填充。如果没有它,它们将保持空白,在Firefox的错误控制台中也看不到任何错误信息。此代码是在onclick事件中运行的。我使用DataTables,当有人双击表格中的一行时,页面就会填充内容。再次强调,除了今天早些时候添加的2个新元素之外,一切正常。更大的问题是这似乎是我代码中经常出现的问题。此外,我尝试过jQuery的AJAX调用,但没有什么进展,而我的大部分代码都是使用xmlHttp和JS编写的。