JSONP回调错误

4
我正在使用火狐插件生成器。运行这段代码时出现“callback未定义”的错误。
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个回答

3
我假设您是从内容脚本运行此代码的。需要考虑到内容脚本实际上并未与网页脚本运行在同一上下文中 - 网页无法看到由内容脚本定义的函数,反之亦然(具体描述请参阅文档)。JSONP通过向网页插入<script>标签来工作。这个脚本将在网页的上下文中运行,并且它看不到您在内容脚本中定义的回调函数。
要在窗口上下文中定义callback函数,请执行以下操作:
unsafeWindow.callback = function(data)
{
  window.alert(data.status);
};

然而,你应该认真对待文档中有关unsafeWindow警告,尽可能避免使用它。在扩展中使用request来加载数据:
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);
  }
});

您可以通过通常的消息传递,向您的内容脚本发送response.json


谢谢Wladimir:像往常一样,您的答案解决了我的jsonp问题。我正在从内容脚本进行$.ajax jsonp调用,但回调没有被触发。 - Pankaj Kumar

0
实际上,针对Marcelo Diniz和任何试图让完整API工作的人:
您需要在您的URL中添加&jsonp=?,否则您的ajax请求将始终失败。

我曾经因为来自compete的文档含糊不清而苦苦挣扎。


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);
    }
});

0

您不应该在URL中添加jsonp=?,这是由ajax函数完成的。

仅使用:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接