2009-07-29 13 views
1

ページごとに複数のXMLHttpRequestを実行できるFirefox拡張機能を作成しようとしています。コードは次のとおりです(私のmain関数は、異なるURLでmakeRequestを呼び出します)。私の問題は、さまざまな応答を表示するのではなく、常に同じURLを返すことです(デバッグの目的では "警告( 'Found ...')」)。私は、http_requestインスタンスをalertContents()関数に直接渡すのではなく、http_requestを直接使うのではなく、どうやって正しいかどうかわからないという問題があると思います。ありがとうございました。Firefox Extension - ページごとに複数のXMLHttpRequest呼び出しを呼び出す

function makeRequest(url,parameters) { 
    http_request = false; 
    http_request = new XMLHttpRequest(); 
    if (http_request.overrideMimeType) { 
     http_request.overrideMimeType('text/xml'); 
    } 
    if (!http_request) { 
     alert('Cannot create XMLHTTP instance'); 
     return false; 
    } 
    http_request.onreadystatechange = alertContents; 
    http_request.open('GET', url + parameters, true); 
    http_request.send(null); 

} 

function alertContents() { 
    if (http_request.readyState == 4) { 
     if (http_request.status == 200) { 
      alert('Found: ' + http_request.responseText); 
     } else { 
     alert('There was a problem with the request.'); 
     } 
    } 
} 

答えて

2

あなたの問題は、makeRequest関数が呼び出されるたびに再利用されるhttp_request識別子が1つしかないことです。 1つの簡単な調整があります。 -

function makeRequest(url,parameters) { 
    var http_request = new XMLHttpRequest(); 
    if (http_request.overrideMimeType) { 
     http_request.overrideMimeType('text/xml'); 
    } 
    if (!http_request) { 
     alert('Cannot create XMLHTTP instance'); 
     return false; 
    } 
    http_request.onreadystatechange = function() { 
      alertContents(http_request) 
     }; 
    http_request.open('GET', url + parameters, true); 
    http_request.send(null); 
     return http_request; 
} 

function alertContents(http_request) { 
    if (http_request.readyState == 4) { 
     if (http_request.status == 200) { 
      alert('Found: ' + http_request.responseText); 
     } else { 
     alert('There was a problem with the request.'); 
     } 
       http_request.onreadystatechange = fnNull; 
    } 
} 

    function fnNull() { }; 

http_request識別子は、各makeRequest実行に対してローカルです。キャプチャを使用してonreadystatechangeが起動されるたびに、XHRの正しいインスタンスがalerrContentsに渡されます。

ところで、なぜパラメータからURLを区切りますか?呼び出し元は、パラメータ引数が正しくURLにエンコードされていることを保証する必要があるため、非常に有用な抽象化のようには見えません。さらに、呼び出し元は単にクエリー文字列を含むURLを単純に渡すことができます。

+0

をvar'edされていません。ありがとう! 合意しました - 抽象化によって、私のほうがやや簡単になりました。 – GavinR

0

はい、同じXMLHttpRequestを使用してください。

Infactは、このコードを使ってみて、それが動作するかどうかを確認:上記のコードで

function makeRequest(url,parameters) { 
    http_request = false; 
    http_request = new XMLHttpRequest(); 
    if (http_request.overrideMimeType) { 
      http_request.overrideMimeType('text/xml'); 
    } 
    if (!http_request) { 
      alert('Cannot create XMLHTTP instance'); 
      return false; 
    } 
    http_request.onreadystatechange = function() { 
     if (http_request.readyState == 4) { 
      if (http_request.status == 200) { 
         alert('Found: ' + http_request.responseText); 
      } else { 
       alert('There was a problem with the request.'); 
      } 
     } 
    }; 
    http_request.open('GET', url + parameters, true); 
    http_request.send(null); 
} 

、私は単にonreadystatechangeイベントに関数を直接取り付けられています。

+0

これはまだ一つだけHTTP_REQUEST識別子が存在する問題があり、HTTP_REQUESTは本当に助け – AnthonyWJones

1

この機能は、さらに、クロスブラウザの機能を改善することができます。

function makeRequest(method, url, parameters) { 
    var http_request = false; 
    if (window.XMLHttpRequest) { // Mozilla, Safari,... 
     http_request = new XMLHttpRequest(); 
     if (http_request.overrideMimeType) { 
      // set type accordingly to anticipated content type 
      http_request.overrideMimeType('text/xml'); 
      //http_request.overrideMimeType('text/html'); 
     } 
    } else if (window.ActiveXObject) { // IE 
     try { 
      http_request = new ActiveXObject("Msxml2.XMLHTTP"); 
     } catch (e) { 
     try { 
      http_request = new ActiveXObject("Microsoft.XMLHTTP"); 
     } catch (e) {} 
     } 
    } 
    if (!http_request) { 
     alert('Cannot create XMLHTTP instance'); 
     return false; 
    } 
    http_request.onreadystatechange = function() { 
     alertContents(http_request); 
    } 
    url += (method=="GET")?parameters:""; 
    http_request.open(method, url, true); 
    if (method == "POST") { 
     http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
     http_request.setRequestHeader("Content-length", parameters.length); 
     http_request.setRequestHeader("Connection", "close"); 
    } 
    http_request.send((method=="GET")?null:parameters); 
}