我正在尝试从 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 作为参数发送到 yahooapis.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 向雅虎发送查询似乎没有意义)。
那么我该如何处理呢?就我而言,jQuery 方式(这个)是唯一合适的。使用来自 SDK 的调用(忘记名称)有不同的可能性,这似乎可行,但我有一定的条件,因为我必须使用 JQuery 进行请求。我完全不明白为什么我在这里遇到跨域问题。我还盲目尝试将跨域标头添加到服务器的响应中,但没有效果。
谢谢。
编辑:
这是我正在编辑的插件,如果有人想查看完整的代码:
https://builder.addons.mozilla.org/package/197498/
问题文件是 data/popup.js。
回答评论 - 我从 data/popup.js 调用它。该文件在面板中使用,在主 js 文件中初始化,如下所示(lib/main.js):
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});"
});