9

我对 jsonp 和 jquery 有一些问题。

这是我的代码 -

var myCallback = function(data) {
  console.log(data);
};

$.ajax({
  url: my_url,
  type: 'GET',
  dataType: 'jsonp',
  jsonp: 'callback',
  jsonpCallback: 'myCallback'
});

jQuery?callback=myCallback&_=1340513330866向 my_url 添加了类似的内容,并且从 my_url 返回的数据是myCallback('abcd')- 尽管实际上它会返回一些 HTML 代码而不是abcd.

问题:abcd没有通过myCallback. 那我做错了什么?我的印象是返回的数据将在脚本标签内执行?

4

4 回答 4

18

如果您使用自己的函数,则必须将其显式声明为global。例如:

window.myCallback = function(data) {
  console.log(data);
};

演示


解释

响应成功的 JSONP 请求而应调用的每个函数都必须是全局的。jQuery 也在这样做。这是因为 JSONP 只不过是包含一个(动态生成的(大部分时间))带有<script>标签的 JavaScript 文件,它只包含一个函数调用。由于每个脚本都是在全局范围内评估的,因此调用的函数也必须是全局的。

于 2012-06-24T05:32:33.573 回答
1

1)从被调用的方法中移动单引号(如 Umesh Aawte 所写)

2)使回调全局

3)您的回调现在是 jQuery 的一部分,所以是您获取数据的方式

此后的解决方案:(使用jQuery:v3.3.1,节点:v6.10.0,快递:v4.16.3

window.myCallback = function() {
  console.log(this.data);
}

$.ajax({
  url: my_url,
  type: 'GET',
  dataType: 'jsonp',
  jsonp: 'myCallback',
  jsonpCallback: myCallback
});

就是这样!

于 2018-08-16T20:03:48.907 回答
0

从被调用的方法中删除单引号这将起作用,请在此处检查代码,

var myCallback = function(data) {
      console.log(data);
    };

$.ajax({
  url: my_url,
  type: 'GET',
  dataType: 'jsonp',
  jsonp: 'callback',
  jsonpCallback: myCallback
});

试试这个小提琴

于 2012-06-24T04:53:29.197 回答
0

为什么不简单:

$.getJSON(my_url, myCallback);

这将处理函数范围,看起来更简单

于 2012-06-24T06:23:43.863 回答