我在jsonp和jquery上遇到了一些问题。
这是我的代码——
var myCallback = function(data) {
console.log(data);
};
$.ajax({
url: my_url,
type: 'GET',
dataType: 'jsonp',
jsonp: 'callback',
jsonpCallback: 'myCallback'
});
jQuery在my_url中添加了类似?callback=myCallback&_=1340513330866
的东西,并且从my_url返回的数据是myCallback('abcd')
- 尽管实际上它将返回一些HTML代码而不是abcd
。
问题:abcd
未通过 myCallback
登录到控制台。那我做错了什么?我的印象是返回的数据将像在脚本标签中一样执行?
如果使用自己的函数,则必须将其显式声明为全局函数。例如:
window.myCallback = function(data) {
console.log(data);
};
演示
解释
为响应成功的 JSONP 请求而应调用的每个函数都必须是全局函数。 jQuery也在这样做。这是因为 JSONP 只不过是一个(动态生成的(大多数时候))JavaScript 文件,带有一个 <script>
标签,它只包含一个函数调用。 由于每个脚本都是在全局范围内计算的,因此调用的函数也必须是全局函数。
1)从调用的方法中移动单引号(如Umesh Aawte所写)
2) 使回调全局化
3)你的回调现在是jQuery的一部分,所以这是你获取数据的方式。
以下解决方案:(使用jQuery:v3.3.1,节点:v6.10.0,express:v4.16.3
window.myCallback = function() {
console.log(this.data);
}
$.ajax({
url: my_url,
type: 'GET',
dataType: 'jsonp',
jsonp: 'myCallback',
jsonpCallback: myCallback
});
这就是所有人!
从调用的方法中删除单引号,这将起作用,请检查此处的代码,
var myCallback = function(data) {
console.log(data);
};
$.ajax({
url: my_url,
type: 'GET',
dataType: 'jsonp',
jsonp: 'callback',
jsonpCallback: myCallback
});
试试这个小提琴
为什么不简单地:
$.getJSON(my_url, myCallback);
这将处理函数范围,看起来要简单得多