jQuery JSONP没有调用回调

时间:2012-06-24 04:50:21

标签: javascript jquery jsonp

我在使用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在控制台中记录。那我做错了什么?我的印象是返回的数据将在脚本标记内执行?

4 个答案:

答案 0 :(得分:16)

如果您使用自己的功能,则必须明确声明为全局。例如:

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

DEMO


<强>解释

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

答案 1 :(得分: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
});

那是所有人!

答案 2 :(得分:0)

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

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

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

试试这个fiddle

答案 3 :(得分:0)

为什么不简单:

$.getJSON(my_url, myCallback);

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