多个XML请求数组

时间:2010-04-22 21:40:27

标签: javascript ajax arrays xmlhttprequest

OMG,我需要一种基于idShout - 1设置XML请求数组的方法。

所以它会是这样的......

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正确设置......?

1 个答案:

答案 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);
}