所以它会是这样的......
var req = new Array();
req[idShout - 1] = ALL XML Data...
这是我到目前为止所得到的,但它根本不起作用:(
var idShout;
var req = new Array();
function htmlRequest(url, params, method)
{
req[req.push] = ajax_function();
for (i=0;i<req.length;i++)
{
(function (i) {
if (req[i])
{
if (method == "GET")
{
req[i].onreadystatechange = function()
{
if (req[i].readyState != 4)
return;
if (req[i].responseText !== null && req[i].status == 200)
{
document.getElementById("shoutbox_area" + idShout).innerHTML = req[i].responseText;
}
}
}
req[i].open(method,url,true);
if (method == "POST")
req[i].setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
if (params == "")
req[i].send(null);
else
req[i].send(params);
return req[i];
}
else
return null;
})(i);
}
}
function ajax_function()
{
var ajax_request = null;
try
{
// Opera 8.0+, Firefox, Safari
ajax_request = new XMLHttpRequest();
}
catch (e)
{
// IE Browsers
try
{
ajax_request = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
try
{
ajax_request = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e)
{
//No browser support, rare case
return null;
}
}
}
return ajax_request;
}
function send(which)
{
var send_data = "shoutmessage=" + document.getElementById("shout_message" + which).value;
var url = smf_prepareScriptUrl(smf_scripturl) + "action=dreamaction;sa=shoutbox;xml;send_shout="+ which;
htmlRequest(url, send_data, "POST");
document.getElementById("shout_message" + which).value = "";
document.getElementById("shout_message" + which).focus();
return true;
}
function startShouts(refreshRate, shoutCount)
{
clearInterval(Timer[shoutCount-1]);
idShout = shoutCount;
show_shouts();
Timer[shoutCount - 1] = setInterval("show_shouts()", refreshRate);
return;
}
function show_shouts()
{
var url = smf_prepareScriptUrl(smf_scripturl) + "action=dreamaction;sa=shoutbox;xml;get_shouts=" + idShout;
htmlRequest(url, "", "GET");
}
对此有任何帮助将不胜感激...... 基本上,我在此之前将Timer Arrays设置为不同的函数,并且我调用startShouts,它应该显示所有信息,但startShouts被多次调用,这就是我将idShout设置为等于shoutCount的原因。所以它会像这样:shoutCount = 1,shoutCount = 2,shoutCount = 3,每次调用它。所以我设置了req [idShout - 1]数组,它应该返回结果吗??
好吧,我在错误控制台中使用上面的代码在Firefox中没有错误,但它不起作用......任何想法?因为它需要输出到多个区域... argg。
感谢您在此提供的任何帮助:)
谢谢你们:)
另外,关于这个的更多信息...... 基本上在任何给定的页面上都有一个或多个Shoutbox(不要问为什么?),我需要能够获取它的信息并将其放入document.getElementById(“shoutbox_area”+ idShout),因为idShout对于每个元素,对于该页面上的每个Shoutbox,更改递增1。 Shoutbox的值可以不同,例如refreshRate可以不同。 1 Shoutbox可以具有类似2000毫秒的刷新率,而另一个可以具有250毫秒的速率,它们需要不同并在为它们定义的时间刷新,所以这就是我决定制作Timer数组的原因虽然不确定我是否按照setInterval函数的设置方式设置了Timer数组。以下是在调用startShouts之前运行的不同javascript函数中完成的方式...
这部分在函数之外,在文档本身内:
var Timer = new Array();
这部分是在函数中......
Timer[shoutCount - 1] = "";
所以不确定这是否为Timers正确设置......?
答案 0 :(得分:0)
由于XHR是异步的,因此当readystatechange
回调函数触发时i
的值已发生变化。您需要在循环期间为i
变量创建单独的闭包。最简单的方法是在代码块周围包装一个匿名函数,并以i
作为第一个参数传递它:
for (i=0;i<req.length;i++)
{
(function (i) {
if (req[i])
{
if (HttpMethod == "GET")
{
req[i].onreadystatechange = function()
{
if (req[i].readyState != 4)
return;
if (req[i].responseText !== null && req[i].status == 200)
{
document.getElementById("shoutbox_area" + idShout).innerHTML = req[i].responseText;
}
}
}
req[i].open(HttpMethod,url,true);
if (HttpMethod == "POST")
req[i].setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
if (params == "")
req[i].send(null);
else
req[i].send(params);
return req[i];
}
else
return null;
})(i);
}