我对JS有点新鲜,而且我的代码遇到了一些问题。
我向服务器发出Ajax请求,从中我得到了响应。由于它是跨域请求,我使用的是JSONP。
$.ajax({
url: "***",
contentType: 'application/javascript',
dataType: "jsonp",
jsonpCallback: "parseResponse"
})
.done(function (response) {
doSomething();
})
.fail(function (error)) {
console.log(error);
}
我得到的回应:
parseResponse({...})
我的问题是理解parseResponse回调是如何工作的。有了这段代码我有时会得到
"未捕获的ReferenceError:未定义parseResponse" 。
但部分回复通过OK(在 .done 函数中我过滤响应,并从那里填写表格。)
如何正确定义parseResponse?
编辑: " parseResponse"是Geoserver服务设置的默认回调。
回复示例:
parseResponse({"type":"FeatureCollection","totalFeatures":"unknown","features":[],"crs":null})
通常,要素属性数组将填充一些数据。
答案 0 :(得分:2)
从ajax
来电中删除jsonpCallback: "parseResponse"
。这让jQuery可以为您处理所有工作。 (它创建一个唯一的函数名称,创建函数,将名称传递给端点,并在完成后清理函数。)
同时删除contentType: "application/javascript"
。您并非将 JavaScript代码发送到服务器。
$.ajax({
url: "***", // <== Make sure this DOESN'T have ?callback= on it
dataType: "jsonp"
})
.done(function(response) {
doSomething();
})
.fail(function(error)) {
console.log(error);
});
根据您的评论,目标服务(Geoserver)需要一个荒谬的选项来指定JSONP回调:format_options=callback:name
。根本不能与ajax
很好地配合(我之前从未见过对JSONP的这种过分支持)。
要在不使用硬编码名称的情况下处理它(因为硬编码名称不是一个好主意,你不能重叠调用),我们必须玩这样的愚蠢游戏:
var callbackName = "myJSONPCallback" + Date.now() + Math.floor(Math.random() * 100000);
$.ajax({
url: "//the-url?format_options=callback:" + callbackName,
// Include ----^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// in the URL
dataType: "jsonp",
jsonp: false,
jsonpCallback: callbackName
})
.done(function(response) {
doSomething();
})
.fail(function(error)) {
console.log(error);
});
有关ajax
和jsonp
选项的详细信息,请参阅jsonpCallback
文档(上面链接)。