我正在使用XMLHttpRequest在我正在开发的服务器和Firefox扩展之间交换数据。不幸的是,这些请求似乎与当前打开的页面有某种联系 - 如果我尝试在当前选项卡关闭时发出请求,它将失败并显示错误。如何使我的请求来自扩展本身,与标签中的内容无关?
编辑:这是重现此问题的代码。它作为主扩展体运行(我的设计基于http://kb.mozillazine.org/Getting_started_with_extension_development的“Hello world”教程,所以没有附加SDK。这意味着它在与上面教程中“overlay.js”的代码相同的位置执行。
function createXMLHttpRequest() {
return Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
.createInstance(Components.interfaces.nsIXMLHttpRequest);
}
function issueRequest() {
var req = createXMLHttpRequest();
req.open("GET", "http://google.com", true);
req.addEventListener("load", function(event) {
alert("SUCCES");
});
req.addEventListener("error", function(event) {
alert("ERROR");
});
req.send();
};
window.addEventListener("DOMContentLoaded", function(event) {
issueRequest();
var doc = event.originalTarget;
var win = doc.defaultView;
win.addEventListener("unload", function(event) {
issueRequest();
});
});
打开新标签后会出现“SUCCESS”,关闭后会出现“ERROR”。我宁愿有两个成功。
答案 0 :(得分:1)
如果该脚本在浏览器窗口覆盖中运行,那么您将DOMContentLoaded
处理程序附加到错误的节点 - 只有在浏览器窗口本身加载时才会收到通知。因此,您的unload
处理程序等待浏览器窗口关闭,您可能希望等待关闭选项卡。正确的代码如下所示:
// Wait for the browser window to load before doing anything
window.addEventListener("load", function() {
// Attach a listener to the tabbrowser to get notified about new pages
window.gBrowser.addEventListener("DOMContentLoaded", function(event) {
issueRequest();
var doc = event.originalTarget;
var win = doc.defaultView;
win.addEventListener("unload", function(event) {
issueRequest();
});
}, false);
}, false)