2

ページ上の特定のテキストを置き換えるかなり単純なタスクがあります。たとえば、10 個の 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++;
)
4

1 に答える 1

3

Ajaxは非同期であるため、応答が配信されるときに、ループはすでに終了しています(so 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++;
}
于 2012-04-15T10:28:31.747 に答える