对同一 AJAX 函数的串行调用仅返回上次调用的数据
Serial call to same AJAX function only returns data from last call
我有三个div元素,我想用自己的内容填充每个元素。我每次都调用相同的 AJAX(非常通用(函数,将div id 的名称作为参数发送:
//left-right rectangle content
var rl = getContent("rightLeft");
//bottom content
var br = getContent("bottomRectangle");
//top content
var rtr = getContent("rightTopRectangle");
如果我在 AJAX 函数中执行警报(http.responseText(,我会从远程页面获得正确的 html 内容。(事实上,如果我添加警报,它似乎会"减慢"函数的速度,以便每次调用它时都会正确返回我的内容,但谁希望在他们的网页上发出警报?
但是,如果没有警报,上述调用将仅正确处理最后一个呼叫。因此,在上面的调用序列中,只有最后一个div,其中 id="rightTopRectangle" 将被从 AJAX 调用中检索到的 html 填充。前两个调用不会使用 AJAX 检索到的 html 填充其div。如果我改变调用的顺序,它将始终是最后一个有效的 AJAX 调用。
我感觉问题与异步部分有关,在一次又一次地请求 AJAX 函数之前,以前的调用没有足够的时间来处理请求。
下面是 AJAX 函数:
function getContent(element){
var url = "ajax/getcontent.php?cid="+element; //alert(url);
http.onreadystatechange=function(){
if (http.readyState==4 && http.status==200){ //alert(http.responseText);
var response = http.responseXML.documentElement;
callback(element,http.responseText);
}
}
http.open("GET",url,true);
http.send();
}
名为"callback"的函数(它工作正常(如下所示:
function callback(e,c){
document.getElementById(e).innerHTML = "<div style='"line-height:"+ document.getElementById(e).offsetHeight +"px;margin:0px auto 0px auto;text-align:center;'" >" + unescape(c) + "</div>";
}
更新:这现在有效。我在 getContent 函数中添加了一行:
function getContent(element){
var http = createRequestObject(); /*After Tej's answer, I took this line out
of the root of my script and placed it here, within the function, in order to
instantiate a new http object each time I call this function, so that they all
operate independently of one another*/
var url = "ajax/getcontent.php?cid="+element; //alert(url);
http.onreadystatechange=function(){
if (http.readyState==4 && http.status==200){
var response = http.responseXML.documentElement;
callback(element,http.responseText);
}
}
http.open("GET",url,true);
http.send();
}
你对所有 ajax 请求重用相同的XmlHttpRequest
;这导致最后一个请求总是获胜,因为其他请求已被覆盖。相反,您应该为每个调用创建一个新的 ajax 请求。
http = CreateAjaxRequest();
http.onreadystatechange = function() { ... }
// etc
你应该element
参数传递给你的onreadystatechange函数,试试这个,
req.onreadystatechange = function (el) {
return function() {
if (http.readyState==4 && http.status==200){ //alert(http.responseText);
var response = http.responseXML.documentElement;
callback(el,http.responseText);
}
};
}(element);
相关文章:
- 如何从ajax调用返回.wrap()元素
- Ajax调用返回当前html页面,而不是请求的文件
- 如何在模式框中显示ajax调用返回的数据
- AngularJS$http.post调用返回502(坏网关)错误
- 有没有更好的方法可以测量从Ajax调用返回数据所需的总时间
- 格式化AJax调用返回的Json,并将其分配给javascript变量
- calling.trigger(“click”),它在ajax调用返回的javascript代码中
- 在异步调用返回之前隐藏页面
- 对php文件的Ajax调用返回该文件中的JS代码,而不是执行它
- 如何在下一次 AJAX 调用中访问从一个 AJAX 调用返回的变量
- jQuery 延迟的 AJAX 调用返回值
- Django Ajax 调用返回 403 错误请求
- 从异步调用返回数组,然后为数组的每个元素返回其他异步调用
- 从函数返回函数而不调用返回的函数
- 当Json Length过长时,对ASP.NET MVC Controller的Ajax调用返回404
- 如何从jQuery中Ajax调用返回的数据中获取对象
- 如果statusCode不是200,那么从http调用返回什么类型的错误对象
- 如何使用jsonp调用返回的数据在Durandal中呈现视图
- 为什么我的ajax调用返回null
- 如何获取ajax调用返回的元素数