来自Firefox扩展的XMLHttpRequest

问题描述:

我正在使用XMLHttpRequest在服务器和Firefox扩展之间交换数据。不幸的是,这些请求似乎与当前打开的页面有某种联系 - 如果我在当前选项卡关闭时尝试发出请求,它将失败并显示错误。我怎样才能使我的请求源于扩展本身,而不依赖于标签中发生了什么?来自Firefox扩展的XMLHttpRequest

编辑:这是重现此问题的代码。它作为主扩展机构运行(我的设计基于“Hello world”教程,来自http://kb.mozillazine.org/Getting_started_with_extension_development,因此没有附加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

请向我们展示一些代码 - 您如何/在哪里创建XMLHttpRequest?我猜你使用附加SDK并从内容脚本执行它? – 2012-04-27 06:05:46

+0

@WladimirPalant我制作了一个简化的测试案例来展示问题。我没有使用附加SDK,并且就我对上述教程的理解而言,此代码作为内容脚本运行。 – 2012-04-27 14:17:17

+0

请在代码中检查'win.location.href'的值 - 我很确定它是浏览器窗口,而不是内容页面。因此,您正在等待浏览器窗口关闭而不是选项卡。 – 2012-04-27 21:00:12

如果该脚本正在浏览器窗口覆盖中运行,那么您将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) 
+0

的确,我正在监听来自整个浏览器的事件 - 但是标签中的DOMContentLoaded事件一路上涨,所以我得到了与代码相同的事件+与加载chrome元素相关的事件。 我试过你的代码,它不会像我一样工作 - 关闭选项卡警报错误。 win和win.location.href在我和你的版本中分别是相同的(同时打开谷歌):“窗www.google.com”和“http://www.google.com/” – 2012-04-27 21:33:17