我对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})
通常,features属性数组将填充一些数据。
最佳答案
从您的jsonpCallback: "parseResponse"
通话中删除ajax
。这使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
文档(上面链接)。