2010-04-22 61 views
1

OMG,我需要一種方法來建立基於該idShout XML請求的陣列 - 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中沒有錯誤,但它不工作...任何想法的人?因爲它需要輸出到多個區域... argg。

感謝您的幫助,您可以點擊這裏提供:)

謝謝你們:)

此外,在這一點的詳細信息... 基本上有1個或多個Shoutboxes任何給定頁面上(不要問爲什麼?),我需要能夠獲取這個信息並將其放入document.getElementById(「shoutbox_area」+ idShout),因爲每個元素的idShout會爲每個Shoutbox增加1在該頁面上。 Shoutbox的值可以不同,例如refreshRate可以不同。 1吼吼箱可以有2000毫秒的刷新率,而另一個可以有250毫秒的速率,它們需要不同並在爲它們定義的時間刷新,所以這就是爲什麼我決定製作一個定時器數組雖然不知道我是否按照setInterval函數設置的方式設置了Timer數組。下面是它獲得在只運行startShouts之前調用不同的JavaScript函數所做的那樣......

這一部分是功能的外部和文件本身:

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 2010-04-22 23:06:44

+0

此外,我現在使用方法而不是HTTPMethod,但它不應該有任何區別... – SoLoGHoST 2010-04-22 23:09:12

+0

好吧,我改變了這個'req [req.push] = ajax_function();'這個'req [idShout - 1] = ajax_function();'現在它正在爲最後一個留言框工作,但它沒有顯示任何信息之前它的?有任何想法嗎? – SoLoGHoST 2010-04-22 23:35:24