【问题标题】:XMLHttpRequest from Firefox Extension来自 Firefox 扩展的 XMLHttpRequest
【发布时间】:2012-04-28 05:05:45
【问题描述】:

我正在使用 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”。我希望有两个成功。

【问题讨论】:

  • 请给我们看一些代码 - 你如何/在哪里创建XMLHttpRequest?我猜你是使用 Add-on SDK 并通过内容脚本来完成的?
  • @WladimirPalant 我制作了一个显示问题的简化测试用例。我没有使用附加 SDK,就我对上述教程的理解而言,此代码作为内容脚本运行。
  • 请检查您的代码中win.location.href 的值 - 我很确定它是浏览器窗口,而不是内容页面。因此,您正在等待关闭浏览器窗口而不是关闭选项卡。

标签: javascript firefox-addon xmlhttprequest


【解决方案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)

【讨论】:

  • 确实,我正在侦听来自整个浏览器的事件 - 但是标签中的 DOMContentLoaded 事件一直在冒泡,所以我得到的事件与您的代码 + 相关的事件相同加载铬元素。我尝试了您的代码,它(不)以与我相同的方式工作 - 关闭选项卡警报错误。 win 和 win.location.href 在我和你的版本中分别相同(打开 google 时):“Window www.google.com”和“google.com
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多