Jquery localhost中Firefox加载项的跨域源错误?

Jquery localhost中Firefox加载项的跨域源错误?,jquery,ajax,firefox-addon,cross-domain,Jquery,Ajax,Firefox Addon,Cross Domain,我正在尝试从Firefox插件向本地运行的服务器发出ajax请求: $.ajax({type: "GET",url: "http://localhost:9000/getFoo?param=foo", success: function (data) { console.log("response: " + data); }, error: function(xhr, textStatus, errorThrown) { console.log("error! xhr status:

我正在尝试从Firefox插件向本地运行的服务器发出ajax请求:

$.ajax({type: "GET",url: "http://localhost:9000/getFoo?param=foo",

success: function (data) {
  console.log("response: " + data);
},
error: function(xhr, textStatus, errorThrown) {
  console.log("error! xhr status: " + xhr.status);
  console.log("error! textStatus: " + textStatus);
  console.log("error! errorThrown " + errorThrown);

}


});
如果我把这个url放在浏览器中,它可以正常工作,但是在附加组件中它执行错误回调,状态为0,没有消息

经过研究,我发现这似乎是跨域源错误的症状(尽管我不明白为什么)。这可以通过以下事实得到证实:在我正在修改的原始加载项的代码中,(远程)url作为参数发送到yahooapi.com,而不是直接使用:

var q = encodeURIComponent('select * from html where url="'+url+'" and xpath='+"'//"+'td[contains(@class,"text")]'+"'"+' limit 1');
url = 'http://query.yahooapis.com/v1/public/yql?q='+q;
(有了这个,最初的请求就可以工作了。不过我甚至没有用我的请求进行测试,因为用localhost向yahoo发送查询似乎没有意义)

那我该怎么处理呢?对于我的情况,jQuery方式(这一种)是唯一合适的。使用SDK的调用(忘记了名称)有不同的可能性,这似乎是可行的,但我有一些条件,因为我必须使用JQuery执行请求。我一点也不明白为什么我在这里遇到跨域问题。我还盲目尝试将跨域头添加到服务器的响应中,但没有效果

谢谢

编辑

这是我正在编辑的附加组件,如果有人想查看完整的代码:

问题文件是data/popup.js

为了回答这个评论,我从data/popup.js调用它。此文件用于面板,面板在主js文件中初始化,如下所示(lib/main.js):


XMLHttpRequest
以及由此而来的
$。内容脚本中的ajax
受到同源策略/CORS的限制

  • 您必须在本地主机上实现CORS。(但不太确定CORS是否在具有本地URI的面板中工作…)
  • 或者使用模块。使用请求模块需要在lib脚本和content脚本之间进行一些转换
  • 或者等待时机

XMLHttpRequest
以及由此产生的
$。内容脚本中的ajax
受到同源策略/CORS的限制

  • 您必须在本地主机上实现CORS。(但不太确定CORS是否在具有本地URI的面板中工作…)
  • 或者使用模块。使用请求模块需要在lib脚本和content脚本之间进行一些转换
  • 或者等待时机

您在什么上下文中调用
$.ajax
?简单的XUL(覆盖),内容脚本,…?我用细节编辑了这个问题。我还添加了一个到原始附加组件的链接,这里有所有的代码。在什么上下文中你称之为
$。ajax
?简单的XUL(覆盖),内容脚本,…?我编辑了问题的细节。我还添加了一个链接到原来的附加组件,有所有的代码。Agh。您再次:)我在服务器的响应中添加了以下标题:`“访问控制允许来源”->“*”,“访问控制允许方法”->“POST、GET、OPTIONS、PUT、DELETE”,“访问控制允许标题”->“内容类型”`但它不起作用。无论如何,正确/干净的方法似乎是使用请求模块和消息传递,对吗?是的,干净的方法将使用请求模块。因为它似乎与yahooapi.com URI一起工作,所以我希望正确实现的CORS也能工作……据我记忆所及,我对请求模块所做的测试是成功的。我的问题是,我需要在面板中执行此操作,而那里的请求模块不可用。但是,如果我使用消息传递,我认为一切都会工作。如果我的假设有错误,我会回来:)啊。您再次:)我在服务器的响应中添加了以下标题:`“访问控制允许来源”->“*”,“访问控制允许方法”->“POST、GET、OPTIONS、PUT、DELETE”,“访问控制允许标题”->“内容类型”`但它不起作用。无论如何,正确/干净的方法似乎是使用请求模块和消息传递,对吗?是的,干净的方法将使用请求模块。因为它似乎与yahooapi.com URI一起工作,所以我希望正确实现的CORS也能工作……据我记忆所及,我对请求模块所做的测试是成功的。我的问题是,我需要在面板中执行此操作,而那里的请求模块不可用。但如果我使用消息传递,我认为一切都会正常。如果我的假设有错误,我会回来:)
var mypanel = require("sdk/panel").Panel({
  width:370,
  height:60,
  contentURL: data.url("clock.html"),
  contentScriptFile:
    [data.url("jquery-1.10.2.min.js"), data.url("popup.js")],
  contentScript: "self.port.emit('resize', " +
                   "{width: document.documentElement.clientWidth, " +
                   "height: document.documentElement.clientHeight});"
});