Расширение Firefox - несколько вызовов XMLHttpRequest на страницу - PullRequest
1 голос
/ 30 июля 2009

Я пытаюсь создать расширение Firefox, которое может запускать несколько запросов XMLHttpRequest на страницу. Код ниже (моя основная функция вызывает makeRequest для разных URL). Моя проблема заключается в том, что он всегда возвращает (в «оповещении (« Найдено ... »)» в целях отладки) один и тот же URL-адрес вместо отображения разных ответов. Я думаю, что проблема заключается в том, что я должен как-то передать экземпляр http_request в функцию alertContents () вместо того, чтобы просто использовать http_request напрямую, но не уверен, как или если это правильно. Спасибо.

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

Ответы [ 3 ]

2 голосов
/ 30 июля 2009

Ваша проблема в том, что у вас есть только один идентификатор http_request, который используется повторно при каждом вызове функции makeRequest. Вот одна простая настройка: -

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. Правильный экземпляр XHR затем передается в alertrContents каждый раз, когда onreadystatechange запускается с использованием перехвата.

Кстати, почему отдельный URL от параметров? Поскольку вызывающая сторона должна убедиться, что аргумент параметров правильно закодирован, это не выглядит как очень полезная абстракция. Кроме того, вызывающий может в любом случае просто передать URL-адрес, содержащий строку запроса.

1 голос
/ 14 января 2010

эта функция может быть улучшена за счет кросс-браузерной функциональности:

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);
}
0 голосов
/ 30 июля 2009

Да, вы должны использовать тот же 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...