Firefox扩展 - 每页多XMLHtt prequest电话每页、电话、Firefox、prequest

2023-09-10 16:18:05 作者:不羡江中仙

我想创建一个Firefox扩展,可以每页运行多个XMLHtt prequests。在code是低于(我的主函数调用不同的URL中makeRequest)。我的问题是,它总是返回(在警报('发现......')用于调试)相同的URL,而不是显示的不同反应。我认为这个问题是我应该以某种方式通过HTTP_REQUEST实例到alertContents()函数,而不是仅仅使用HTTP_REQUEST直接的,但不知道如何,或者如果这是正确的。谢谢你。

 函数makeRequest(URL,参数){
   HTTP_REQUEST = FALSE;
   HTTP_REQUEST =新XMLHtt prequest();
   如果(http_request.overrideMimeType){
http_request.overrideMimeType(为text / xml');
   }
   如果(!HTTP_REQUEST){
警报(无法创建XMLHTTP实例);
返回false;
   }
   http_request.onreadystatechange = alertContents;
   http_request.open(GET,URL +参数,真正的);
   http_request.send(空);

}

功能alertContents(){
   如果(http_request.readyState == 4){
如果(http_request.status == 200){
警报('发现:+ http_request.responseText);
	  } 其他 {
警报('有与请求的问题。');
}
   }
}
 

解决方案

您的问题是,你只得到了这是每次makeRequest函数调用时重复使用1 HTTP_REQUEST标识符。这里有一个简单的调整: -

 函数makeRequest(URL,参数){
   VAR HTTP_REQUEST =新XMLHtt prequest();
   如果(http_request.overrideMimeType){
http_request.overrideMimeType(为text / xml');
   }
   如果(!HTTP_REQUEST){
警报(无法创建XMLHTTP实例);
返回false;
   }
   http_request.onreadystatechange =功能(){
           alertContents(HTTP_REQUEST)
       };
   http_request.open(GET,URL +参数,真正的);
   http_request.send(空);
       返回HTTP_REQUEST;
}

功能alertContents(HTTP_REQUEST){
   如果(http_request.readyState == 4){
如果(http_request.status == 200){
警报('发现:+ http_request.responseText);
	  } 其他 {
警报('有与请求的问题。');
}
              http_request.onreadystatechange = fnNull;
   }
}

    功能fnNull(){};
 
Firefox 火狐浏览器 官方正式版

该HTTP_REQUEST标识符是本地为每个makeRequest执行。 XHR的正确实例然后被传递给alerrContents onreadystatechange的是通过使用捕获烧制每次

顺便说一句,为什么单独的URL参数从?这似乎是一个非常有用的抽象,因为主叫方必须确保参数的参数是否正确url可连接codeD不。此外,调用者可以简单地通过包含查询字符串反正一个网址。

I am trying to create a Firefox extension that can run multiple XMLHttpRequests per page. The code is below (my main function calls the makeRequest on different URLs). My problem is that it always returns (at the "alert('Found ...')" for debugging purposes) the same URL instead of displaying the different responses. I think the issue is that I should somehow pass the http_request instance to the alertContents() function instead of just using http_request directly, but not sure how or if this is correct. Thank you.

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

解决方案

Your problem is you've only got one http_request identifier which is reused every time the makeRequest function is called. Here is one simple adjustment:-

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

The http_request identifier is local to each makeRequest execution. The correct instance of XHR is then passed to alerrContents each time onreadystatechange is fired by using a capture.

BTW, why separate url from parameters? Since the caller has to ensure the parameters argument is correctly url encoded it doesn't seem like a very useful abstraction. In addition the caller can simply pass a URL containing a querystring anyway.