Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Firefox插件sdk扩展中使用main.js中的XMLHttpRequest。(或类似的东西)_Javascript_Firefox_Firefox Addon_Firefox Addon Sdk - Fatal编程技术网

Javascript 如何在Firefox插件sdk扩展中使用main.js中的XMLHttpRequest。(或类似的东西)

Javascript 如何在Firefox插件sdk扩展中使用main.js中的XMLHttpRequest。(或类似的东西),javascript,firefox,firefox-addon,firefox-addon-sdk,Javascript,Firefox,Firefox Addon,Firefox Addon Sdk,我有一个Firefox扩展,需要检查onUnload事件。基本上,当用户禁用扩展时,我想向服务器发送一条消息 我尝试做的是向我的一个内容脚本发送一条消息,然后它将调用XMLHttpRequest。这适用于扩展触发的任何其他事件,但在消息传递之前,内容脚本似乎已卸载 main.js 下面是main.js脚本中的代码: exports.onUnload = function(reason) { //unloadWorker comes from a PageMod 'onAttach: fu

我有一个Firefox扩展,需要检查onUnload事件。基本上,当用户禁用扩展时,我想向服务器发送一条消息

我尝试做的是向我的一个内容脚本发送一条消息,然后它将调用XMLHttpRequest。这适用于扩展触发的任何其他事件,但在消息传递之前,内容脚本似乎已卸载

main.js 下面是main.js脚本中的代码:

exports.onUnload = function(reason) {
    //unloadWorker comes from a PageMod 'onAttach: function(worker){}'
    //That is called every time a page loads, so it will a recent worker.
    if(unloadWorker != null) { 
        unloadWorker.port.emit("sendOnUnloadEvent", settings, reason);
    }
};
内容脚本 下面是我附加到每个加载页面的内容脚本中的代码

self.port.on("sendOnUnloadEvent", function(settings, reason) {
    console.log("sending on unload event to servers");
    settings.subid = reason;
    if(reason != "shutdown") {
        sendEvent(("on_unload"), settings);
    }
});
发送事件代码 最后,这里是发送事件代码,仅供参考,以了解我最初计划如何使用XMLHttpRequest:

sendEvent = function(eventName, settings) {

    if (!eventName) {
        eventName = "ping"; 
    }
    //Not the actual URL, but you get the idea.
    var url = 'http://example.com/sendData/?variables=value&var2=value2'

    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {

    }

    xhr.open("GET", url, true);
    xhr.send();
}
是否仍然可以使用main.js中的XMLHttpRequest


或者是一种触发onUnload事件的方法,但是在扩展实际卸载之前是否触发它?(就像BeforeOnLoad类型的事件)

从main.js发出网络请求的首选方法是使用模块中的
请求
对象

但是,
Request
只能发出异步请求,这意味着当函数结束时,对象将超出范围,请求将不会发生

相反,您可以使用,以便能够使用
XMLHttpRequest
并进行如下的on unload操作:

const {XMLHttpRequest} = require("sdk/net/xhr");
exports.onUnload = function(reason) {
    var url = 'http://mysite.com/sendData/?variables=value&var2=value2'
    var xhr = new XMLHttpRequest();
    xhr.open('GET', url, false);
    xhr.send(null);
});

但请注意,
sdk/net/xhr
被标记为不稳定,同步请求被阻塞,不受欢迎。

我的解决方案与user2958125略有不同,因此我将在下面发布它

const {Cc, Ci} = require("chrome");
var xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
//var xhr = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Components.interfaces.nsIXMLHttpRequest);

xhr.onreadystatechange = function() {

}

xhr.open("GET", url, true);
xhr.send();

我提出了一个不同的解决方案,稍后将发布,但在我看来,我可以保持我的请求异步。你给了我我想要的,但是我的解决方案使用了“require(“chrome”)”,基本上我是这样加载的:const{Cc,Ci}=require(“chrome”);var xhr=Cc[“@mozilla.org/xmlextras/xmlhttprequest;1”].createInstance(Ci.nsIXMLHttpRequest);六羟甲基三聚氰胺六甲醚。。。你的回答很中肯,直到你提出同步请求的那一部分。同步请求不仅仅是“不受欢迎”,它们实际上是不好的。它们要么会阻塞整个用户界面,要么现在它们通常会旋转事件循环,使代码重新进入,这在特权代码(
main.js
等)中是不受支持的。因此,addons.mozilla.org托管的扩展不允许使用它们,这是您应该注意的其他事项。我建议使用异步,而不是同步。我说的是答案本身,而不是您对它的评论;)您应该更喜欢使用
request
模块,或者至少使用@user2958125在另一个答案中建议的
net/xhr
模块(但不包括同步部分)。他们也有回调。另外,当使用普通
XMLHttpRequest
时,大多数情况下
onload
onerror
和/或
onload
都比
onreadystatechange
更可取。看,我认为使用组件可能更好。我已经阅读了一些文档,这些文档讨论了您正在讨论的模块如何无法保证将来会得到支持。虽然我使用的组件基本上与使用XUL进行扩展时使用的组件相同。实际上,您无法保证
chrome
模块将来会得到支持,或者
nsIXMLHttpRequest
会得到支持。但是,
请求
模块标记为稳定,因此将在将来得到支持。
function reqListener () {
  console.log(this.responseText);
}

const {XMLHttpRequest} = require("sdk/net/xhr");
var url = "http://ya.ru";
var xhr = new XMLHttpRequest();
xhr.onload = reqListener;
xhr.open('GET', url, false);
xhr.send(null);