服务器不接受请求URL中的任何参数,因此我需要删除URL中的所有额外参数,当然我无法控制服务器。
jQuery的:
$.ajax({
type: 'GET',
url: 'http://cross-domain.com/the_jsonp_file,
jsonpCallback: 'jsonCallback',
contentType: 'application/json',
cache: 'true',
dataType: 'jsonp',
success: function(json) {
console.log(json);
},
});
JSONP文件:
jsonCallback({"test": "hello"});
当我发送Ajax请求时,URL如下所示:
http://cross-domain.com/the_jsonp_file?callback=jsonCallback
但我需要这个(没有参数):
http://cross-domain.com/the_jsonp_file
修改
以下是我的整个情况:
function MyClass(imgs) {
// imgs is array of URLs
this.imgs = imgs;
this.submit = function() {
// button click event triggers this method
this._show();
};
this._show = function() {
var _this = this;
for (var i = 0; i < _this.imgs.length; i++) {
(function($, j) {
$.ajax({
type: 'GET',
url: _this.imgs[j],
jsonp : false,
jsonpCallback: 'jsonCallback',
cache: 'true',
dataType:'jsonp',
success: function(json) {
console.log(_this.imgs[j]);
},
});
})(jQuery, i);
};
};
};
我收到此错误消息:
Uncaught TypeError: Property 'jsonCallback' of object [object Window] is not a function
奇怪的是很少有请求成功调用jsonCallback。
答案 0 :(得分:10)
检查jQuery文档 - 他们说jsonp:false和jsonpCallback:'callbackFunction'在ajax args ....中:
$.ajax({
url: 'http://cross-domain.com/the_jsonp_file',
jsonp : false,
jsonpCallback: 'jsonCallback',
// contentType: 'application/json', -- you can't set content type for a <script> tag, this option does nothing for jsonp | KevinB
cache: 'true',
dataType : 'jsonp'
});
答案 1 :(得分:1)
每个请求都会调用相同的回调jsonCallback
,所以我认为这就是问题所在。
首先,文档中的Javascript:
<script type="text/javascript">
new Gallery([
['http://cross-domain.url/whatever', '27b2afa5c77c2510'],
['http://cross-domain.url/whatever', '13df51b2f2801bc1'],
['http://cross-domain.url/whatever', '4de326fc9a2c5a24'],
['http://cross-domain.url/whatever', '60c266a73ba699bc'],
['http://cross-domain.url/whatever', '3db01e95aaf2b9f2'],
['http://cross-domain.url/whatever', '94eb17f9b0e1be9c'],
['http://cross-domain.url/whatever', 'ca8c5c3c0b8cd5ae'],
['http://cross-domain.url/whatever', '6b0f5c5737ee88fd'],
['http://cross-domain.url/whatever', '318d8ebb51a97a15'],
['http://cross-domain.url/whatever', 'f5028c8b62e81a8b'],
]);
</script>
客户端将JSONP文件(只是另一个Javascript文件)上传到服务器,如下所示:
jsonCallback_27b2afa5c77c2510({"test": "hello"});
在jsonCallback_
之后添加随机十六进制字符串以分隔每个请求,例如jQuery的默认回调。
从输入中读取随机十六进制字符串并设置为jsonpCallback
:
function Gallery(imgs) {
// imgs is array of URLs
this.imgs = imgs;
this.submit = function() {
// button click event triggers this method
this._show();
};
this._show = function() {
var _this = this;
for (var i = 0; i < _this.imgs.length; i++) {
(function($, j) {
$.ajax({
type: 'GET',
url: _this.imgs[j][0],
jsonp : false,
jsonpCallback: 'jsonCallback_' + _this.imgs[j][1],
cache: 'true',
dataType:'jsonp',
success: function(json) {
// Process
console.log(json.test);
},
});
})(jQuery, i);
};
};
};
谢谢@Adam @Kevin B @Dcullen和大家! :d
p.s:我只输入上面的每个来源,例如,它可能不正确。
答案 2 :(得分:0)
JSONP需要回调作为URL的一部分。根据描述,我猜你正在访问的服务器不支持JSONP。
jQuery为您的文档添加了一个脚本标记,当添加该标记运行API请求时,响应会在您的代码中调用回调函数(这简化了它)。
如果您想要更准确的描述,可以查看维基百科。 http://en.wikipedia.org/wiki/JSONP#How_it_works