2010-04-22 1 views
1

OMG, я нуждаюсь в способе настройки массивов XML запросов, основанные на idShout - 1.Multi-массив 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"); 
} 

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

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

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

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

Кроме того, немного больше информации об этом ... В принципе есть 1 или более Shoutboxes на любой странице (Не спрашивайте, почему?), Мне нужно получить информацию об этом и поместить ее в document.getElementById («shoutbox_area» + idShout), так как idShout для каждого элемента изменяется с шагом 1 на каждый Shoutbox, который на этой странице. Значения для Shoutbox могут быть разными, например, refreshRate может быть другим. 1 Shoutbox может иметь частоту обновления, равную 2000 миллисекундам, тогда как другая может иметь скорость 250 миллисекунд, они должны быть разными и обновляться в то время, которое определено для них, поэтому я решил создать массив Timer , хотя не уверен, что я настроил массив Timer так, как он предназначен для установки для функции setInterval. Вот как это получить сделано в другом яваскрипте функции, которая выполняется непосредственно перед startShouts вызывается ...

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

var Timer = new Array(); 

И эта часть в функции ...

Timer[shoutCount - 1] = ""; 

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

ответ

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); 
} 
+0

Спасибо, я сделал следующие изменения и введенной его выше в вопросе, но ничего не изменилось и все еще ничего в элементах ... ?? Еще никаких ошибок, но в любом из элементов нет ничего ... ?? – SoLoGHoST

+0

Кроме того, теперь я использую метод вместо HTTPMethod, но он не должен иметь никакого значения ... – SoLoGHoST

+0

Хорошо, я изменил этот 'req [req.push] = ajax_function();' на этот 'req [idShout - 1] = ajax_function(); 'и теперь он работает для последнего крикбокса, но он не показывает какую-либо информацию для нее до этого ?? Есть идеи? – SoLoGHoST