可能重复:
passing index from for loop to ajax callback function (javascript)
我对将xmlhttprequests制作到不同的服务器时有点困惑,以便获取一些内容。 这是我写的,但似乎我在某些时候错了..
var URL = new Array();
URL[0] = "http://www.example1.com";
URL[1] = "http://www.example2.com";
URL[2] = "http://www.example3.com";
var nRequest = new Array();
for (var i=0; i<3; i++) {
nRequest[i] = new XMLHttpRequest();
nRequest[i].open("GET", URL[i], true);
nRequest[i].onreadystatechange = function (oEvent) {
if (nRequest[i].readyState === 4) {
if (nRequest[i].status === 200) {
console.log(nRequest[i].responseText);
alert(nRequest[i].responseText);
} else {
console.log("Error", nRequest[i].statusText);
}
}
};
nRequest[i].send(null);
}
在I.E.10上使用此代码我在控制台上被拒绝访问..
如果我删除数组并使用简单请求,它会按预期运行..
wRequest = new XMLHttpRequest();
wRequest.open("GET", "http://www.example1.com", true);
wRequest.onreadystatechange = function (oEvent) {
if (wRequest.readyState === 4) {
if (wRequest.status === 200) {
console.log(wRequest.responseText);
alert(wRequest.responseText);
} else {
console.log("Error", wRequest.statusText);
}
}
};
wRequest.send(null);
但是我该如何触发多个2-3个请求,并且仍然没有数据处理问题。??
答案 0 :(得分:13)
问题(忽略了slebetman所涵盖的跨域问题)是当你的就绪状态更改回调被触发时,它正在使用来自包含范围的i
变量,该变量将在3
之后循环完成。解决这个问题的一种方法如下:
for (var i=0; i<3; i++){
(function(i) {
nRequest[i] = new XMLHttpRequest();
nRequest[i].open("GET", URL[i], true);
nRequest[i].onreadystatechange = function (oEvent) {
if (nRequest[i].readyState === 4) {
if (nRequest[i].status === 200) {
console.log(nRequest[i].responseText);
alert(nRequest[i].responseText);
} else {
console.log("Error", nRequest[i].statusText);
}
}
};
nRequest[i].send(null);
})(i);
}
这为每个循环迭代引入了一个立即调用的函数表达式,使得函数内部的代码具有自己的i
- JS闭包的魔力意味着当调用onreadystatechange
函数时它将访问匿名函数的参数i
(即使该函数已完成),而不是外部作用域的i
,因此每次都会处理正确的nRequest
元素。
此外,您在.open()
行上有一个拼写错误,您说wURL[i]
但应该URL[i]
。
根据您计划对响应文本执行的操作,我不确定您是否需要一组请求:您可以将Ajax代码封装到一个函数中,该函数将URL和回调函数作为参数,并且然后在循环中调用该函数......
答案 1 :(得分:0)
将xmlhttprequests发送到不同的服务器
你做不到。 XMLHttpRequest仅允许连接到页面所属的同一域。这称为“同源政策”。
Google“同源政策”或在此处搜索,以了解详情。