我正在尝试将一组记录保存到mysql数据库中,但我总是在firebug中获取中止消息,除了最后一次保存。如何使用XMLHttpRequest循环保存记录?这是我的代码:
function savingContent()
{
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
var rowindex = 0;
for (x in globalObj.AddedRows)
{
var rowData = "?q=" + globalObj.AddedRows[rowindex];
xmlhttp.open("POST", "insertRowData.php"+rowData, true);
xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xmlhttp.setRequestHeader("Content-Length",rowData.length);
xmlhttp.send(null);
rowindex += 1;
}
答案 0 :(得分:3)
此代码存在很多问题。这是我发现的第一个:
只有在想要迭代对象中的所有字段时才应使用for (x in object)
语法。在这种情况下,你想迭代一个数组,所以你应该这样做:
for (var rowindex = 0; rowindex < globalObj.AddedRows.length; rowindex++) {
}
执行HTTP POST时,不应将要更改的数据放入URL中。将它放在请求的主体中 - 作为xmlhttp.send()的参数。你实际上是在显式传递一个内容长度 - 该长度应该是你传递给xmlhttp.send()的数据的长度 - 所以通过传递NULL几乎肯定是你的主要错误。
不要使用Firebug,最好使用xmlhttp.onreadystatechange来确定哪些请求成功或失败。不要假设一旦你第一次调试它,它将永远成功。处理错误。
答案 1 :(得分:0)
除了dmazzoni:
每次for循环发送异步xml请求时,它都会覆盖先前的请求,因此中止前一个请求。您应该在for循环中创建一个新的XMLHttpRequest(或IE的ActiveXObject),或者在发送新请求之前等待HTTP返回调用。