WHILE循环内的GM_xmlhttpRequest

时间:2012-04-15 10:04:10

标签: javascript while-loop greasemonkey fetch gm-xmlhttprequest

我有一个相当简单的任务来替换页面上的特定文本。比方说,有10个DIV,每个DIV都包含一个特定的信息。我想针对数据库检查此信息,并将文本替换为数据库中的结果。

我将GM_xmlhttpRequest置于一个循环中,该循环应检查此信息并替换10个DIV中的每一个。不幸的是,这不起作用,最后一个DIV包含10个非常相同的信息。换句话说,当i = 10时,GM_xmlhttpRequest执行10次。

以下是简化代码:

var i=1;
while (i<=10) {
  var id = 'div-' + i; //This sets the name of the DIV
  var ShowContent = document.getElementById(id);
  GoToURL = "http://domain.com/?=" + id; //This specifies a URL that changes on every loop
  GM_xmlhttpRequest({
    method: "GET",
    url: GoToURL,
    onload: function(response) {
      ShowContent.innerHTML = response; //This should replace the information for each DIV
      alert(i); //TEST: this shows always 11 (even not 10!). Why?
    }
  });
  i++;
)

1 个答案:

答案 0 :(得分:3)

Ajax是异步的,因此将传递什么响应,您的循环将已经结束(所以i=11)。

但是你可以在响应函数中使用闭包来处理'i'

 var i=1;
 while (i<=10) {
   (function(i){
     var id = 'div-' + i; //This sets the name of the DIV
     var ShowContent = document.getElementById(id);
     GoToURL = "http://domain.com/?=" + id; //This specifies a URL       
     GM_xmlhttpRequest({
         method: "GET",
         url: GoToURL,
         onload: function(response) {
            ShowContent.innerHTML = response; //This should replace the information for each DIV
            alert(i); 
         }
     });
   })(i);
  i++;
}