Firefox Extension - XMLHttpRequest várias chamadas por página
-
05-07-2019 - |
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.');
}
}
}
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
.