jsonp回调错误

时间:2012-01-22 12:37:51

标签: javascript firefox-addon cross-domain jsonp firefox-addon-sdk

我正在使用firefox插件构建器。使用“未定义回调”运行此代码错误

function callback(data) {
   window.alert(data.status);
}

$.ajax({
   url: "http://apps.compete.com/sites/google.com/trended/rank/?apikey=210e634a0b3af972daa908a447c735c1&start_date=201112&end_date=201112&jsonp=?",
   dataType: "jsonp",
   jsonp: "jsonp",
   jsonpCallback: "callback"
});

这是api文档:https://www.compete.com/developer/documentation/

4 个答案:

答案 0 :(得分:3)

我假设你是从内容脚本运行它。您必须考虑内容脚本并不真正在与网页脚本相同的上下文中运行 - 网页无法看到内容脚本定义的功能,反之亦然(detailed description of this mechanism)。 JSONP的工作原理是在网页中插入<script>标记。此脚本将在网页的上下文中运行 - 它不会看到您在内容脚本中定义的回调函数。

要在窗口上下文中定义callback函数,请执行以下操作:

unsafeWindow.callback = function(data)
{
  window.alert(data.status);
};

但是,您应该认真对待warnings about unsafeWindow in the documentation并尽可能避免使用request package。使用附加信息中的usual messaging加载数据:

require("request").Request({
  url: "http://apps.compete.com/sites/google.com/trended/rank/?apikey=210e634a0b3af972daa908a447c735c1&start_date=201112&end_date=201112",
  onComplete: function(response)
  {
    console.log(response.json);
  }
});

然后,您可以通过{{3}}将response.json发送到您的内容脚本。

答案 1 :(得分:0)

试试这个。

$.ajax({
     url: "http://apps.compete.com/sites/google.com/trended/rank/?apikey=210e634a0b3af972daa908a447c735c1&start_date=201112&end_date=201112&jsonp=?",
     dataType: "jsonp",
     success: function(data) {
         window.alert(data.status);
    }
});

答案 2 :(得分:0)

您不应将jsonp=?附加到您的网址,这是由ajax功能完成的。

仅限使用:

url: "http://apps.compete.com/sites/google.com/trended/rank/?apikey=<your-api-key>&start_date=201112&end_date=201112",

答案 3 :(得分:0)

实际上,回应Marcelo Diniz,以及任何试图让竞争API工作的人: 您需要将&jsonp=?附加到您的网址,否则您的ajax请求将始终失败。

我在这方面挣扎了一段时间,因为来自竞争对手的文件很模糊。