Pergunta

Eu estou tentando criar uma extensão do Firefox que pode executar várias XMLHttpRequests por página. O código está abaixo (a minha principal função chama o makeRequest em URLs diferentes). Meu problema é que ele sempre retorna (na "alert ( 'Encontrado ...')" para fins de depuração) a mesma URL em vez de exibir as diferentes respostas. Acho que a questão é que eu deveria de alguma forma passar a instância http_request aos alertContents () função em vez de usar apenas http_request diretamente, mas não sei como ou se isso é correto. Obrigado.

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.');
      }
   }
}
Foi útil?

Solução

Seu problema é que você só tem uma http_request identificador que é reutilizado cada vez que a função makeRequest é chamado. Aqui está o ajuste de um simples: -

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() { };

O http_request identificador é local para cada execução makeRequest. A instância correta do XHR é então passado para alerrContents cada vez onreadystatechange é disparado usando uma captura.

BTW, por separado url a partir de parâmetros? Desde o chamador tem de garantir o argumento de parâmetros é corretamente url codificado que não parece ser uma abstração muito útil. Além disso, o chamador pode simplesmente passar uma URL contendo uma querystring de qualquer maneira.

Outras dicas

Esta função pode ser melhorada com a funcionalidade de cross browser:

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

Sim, você deve usar o mesmo XMLHttpRequest.

De fato, tente usar este código e ver se ele funciona:

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

No código acima, eu simplesmente anexado a função diretamente para o evento onreadystatechange.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top