4

我正在使用Firefox插件生成器。运行这段代码的错误“回调没有定义”jsonp回调错误

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/

回答

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扩展中的加载数据:

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

您可以然后通过usual messaging发送response.json到您的内容脚本。

+0

谢谢弗拉基米尔:像往常一样,你的答案为我解决了jsonp问题。我正在从内容脚本进行$ .jjax jsonp调用,并且回调没有被解雇。 –

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

你不应该附加jsonp=?到您的网址,这是由AJAX功能来完成。只有

用途:

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

事实上,为应对马塞洛·迪尼兹,任何人都试图获得竞争API工作:
您需要&jsonp=?添加到您的网址,否则你的Ajax请求总是失败。

由于来自竞争的文档含糊不清,我一直在为此苦苦挣扎。