Мульти-массив XML-запросов - PullRequest
1 голос
/ 23 апреля 2010

OMG, мне нужен способ настроить массивы XML-запросов на основе idShout - 1.

Так было бы что-то вроде этого ...

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");
}

Любая помощь по этому вопросу будет принята с благодарностью ... По сути, я устанавливаю массивы таймеров в другой функции до этого и вызываю startShouts, который должен показывать всю информацию, но startShouts вызывается более одного раза, поэтому для idShout установлено равное shoutCount. Так что это будет выглядеть примерно так: shoutCount = 1, shoutCount = 2, shoutCount = 3, каждый раз, когда он вызывается. Поэтому я установил массив req [idShout - 1], и он должен вернуть правильный результат ??

Ну, я не получаю ошибок в Firefox в консоли ошибок с этим кодом выше, но это не работает ... Любые идеи кто-нибудь ?? Поскольку это должно быть выведено в более чем 1 область ... argg.

Спасибо за любую помощь, которую вы можете предложить здесь:)

Спасибо, ребята:)

Кроме того, немного больше информации об этом ... По сути, на каждой странице есть 1 или более Shoutboxes. для каждого элемента изменения увеличиваются на 1 для каждого чата, который находится на этой странице. Значения для Shoutbox могут быть разными, например, refreshRate может быть другим. 1 Shoutbox может иметь частоту обновления около 2000 миллисекунд, в то время как другая может иметь частоту 250 миллисекунд, они должны отличаться и обновляться в определенное для них время, поэтому я решил создать массив Timer , хотя и не уверен, что я настроил массив Timer так, как он должен быть настроен для функции setInterval. Вот как это делается в другой функции javascript, которая запускается непосредственно перед вызовом startShouts ...

Эта часть находится за пределами функции и внутри самого документа:

var Timer = new Array();

И эта часть находится в функции ...

Timer[shoutCount - 1] = "";

Так не уверен, правильно ли настроен таймер ...?

1 Ответ

0 голосов
/ 23 апреля 2010

Поскольку 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);
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...