AJAX:在一个循环发送XMLHTTP请求
下面我有这个功能,我呼吁在一个循环中,我得到警报n次,但只有n-1或有时N-2的反应AJAX:在一个循环发送XMLHTTP请求
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
alert(xmlhttp.responseText);
//document.getElementById("warnings_panel").innerHTML+=xmlhttp.responseText;
}
}
alert("in ajax)
xmlhttp.open("GET","getresponse.php?start="+ start + "&end=" + end,true);
xmlhttp.send();
onreadystatechange
该功能当你的函数结束时会终止,因为xmlhttp
对象被删除,因为它不是全局变量。我对吗?
将只放AJAX请求的功能,从而使xmlhttp
对象只创建一次(我用了一个较短的版本创建在这个例子中,xmlhttp
对象)。
var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
function request() {
xmlhttp.open('GET', 'getresponse.php?start=' + start + '&end=' + end, true);
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
alert(xmlhttp.responseText);
}
}
xmlhttp.send(null);
}
我已经在函数上面声明了xmlhttp变量,所以我认为这不是问题....从我听说这里的问题是我的新回复覆盖了前一个..我不知道如何克服它...感谢您的努力 – koool 2011-05-22 22:53:30
重申您的第一条意见:**不**,你说得不对。这就是关闭的地方:JavaScript引擎知道它在函数结束时不会抛弃'xmlhttp'的值,所以它会一直保持活动状态,直到不再需要它为止。 – 2011-05-22 22:55:49
您不应该每次重复使用相同的'xmlhttp';最好使用局部变量创建一个新的。现在,每次调用函数并执行'xmlhttp.open'时,可能的未决请求将被取消。 – 2011-05-22 23:05:22
一般来说,这应该可行,但我们需要更多关于如何真正运行该循环以了解可能出错的信息。
我还添加了encodeURIComponent
,改变了回调函数中的条件,因为status
并不总是200
时readyState
达到4
。
function request(start, end) {
var xmlhttp;
if (window.XMLHttpRequest)
xmlhttp = new XMLHttpRequest();
else
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open('GET', 'getresponse.php?start=' + encodeURIComponent(start) + '&end=' + encodeURIComponent(end), true);
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4)
if (xmlhttp.status == 200) {
alert(xmlhttp.responseText);
} else {
// status ≠ 200, output useful error message
}
};
xmlhttp.send();
}
我会试试这个 – koool 2011-05-22 23:28:56
我已经做了一个类(你可以很容易地修改)在循环中调用一个函数,它会正确调用函数。也许这可能适用于您的需求。
(此外,如果有人看到的东西错了,它是很好的聆听他人意见)
TEST.HTM
<html>
<head>
<script type="text/javascript">
function myXmlHttp() {
/*constructor simulator*/
this.setPersitent=
function (file, onReadyFunc,params,loop)
{
myXmlHttpObj.loop = loop;
myXmlHttpObj.file=file;
myXmlHttpObj.onReadyFunc='myXmlHttpObj.'+onReadyFunc;
myXmlHttpObj.params=params;
myXmlHttpObj.mySetRequest();
}
this.setParams=
function (params)
{
myXmlHttpObj.params=params;
}
<!--Standard initial code-->
this.mySetRequest =
function ()
{
request = false;
try { request = new XMLHttpRequest(); }
catch (trymicrosoft) {
try { request = new ActiveXObject("Msxml2.XMLHTTP"); }
catch (othermicrosoft) {
try {request = new ActiveXObject("Microsoft.XMLHTTP");}
catch (failed) {request = false;}/*catch3*/}/*catch2*/}/*catch1*/
if (!request)
alert("Error initializing XMLHttpRequest!");
} /*func*/
this.mySendReq=
function()
{
var url = myXmlHttpObj.file;
request.open("POST", url, true);
//Some http headers must be set along with any POST request.
request.setRequestHeader
("Content-type", "application/x-www-form-urlencoded;charset=utf-8");
request.setRequestHeader("Content-length", myXmlHttpObj.params.length);
request.setRequestHeader("Connection", "close");
request.onreadystatechange = eval(myXmlHttpObj.onReadyFunc);
request.send(myXmlHttpObj.params);
}
this.listenPHP =
function () {
if (request.readyState == 4) {
if (request.status == 200)
{
alert(request.responseText);
myXmlHttpObj.loop--;
if(myXmlHttpObj.loop>0)
{
myXmlHttpObj.setParams("js_rand="+Math.random()+"");
myXmlHttpObj.mySendReq();
}
}//inner if
else{alert("status is " + request.status);}
}//outer iff
}//function
}//END
myXmlHttpObj = new myXmlHttp();
myXmlHttpObj.setPersitent
('getresponse.php', 'listenPHP',"js_rand="+Math.random()+"",3) ;
myXmlHttpObj.mySendReq();
</script>
</head>
<body >
</body>
</html>
和getresponse.php
<?PHP
echo 'I recived this random from js:',$_POST['js_rand'],'
this rand is from php:',rand(1,9999);
?>
你怎么称呼这个功能?你的循环是什么样的?顺便说一句,你错过了ajax中''''后',但我认为这只是一个复制粘贴错误,否则它根本就不会运行。顺便说一句,使用'encodeURIComponent'总是正确地编码你的查询参数(变量'start'和'end')。 – 2011-05-22 23:02:43
哦,是的!对不起...这个函数在for循环中调用其他函数...谢谢你的努力...如果你能帮助我,我将不胜感激 – koool 2011-05-22 23:05:17
是的,但在上面的代码中显示它。 – 2011-05-22 23:07:08