我正在尝试创建一个对weatherunderground的Ajax调用。 代码是:
$(".city").autocomplete({
source: function( request, response ) {
$.ajax({
// GET http://autocomplete.wunderground.com/aq?query=San%20F
url: "http://autocomplete.wunderground.com/aq?query=",
dataType: "jsonp",
data: {
featureClass: "P",
style: "full",
maxRows: 12,
name_startsWith: request.term
},
success: function( data ) {
response( $.map( data.RESULTS, function( item ) {
return {
label: item.name + item.countryName,
value: item.name
};
}));
}
});
},
minLength: 2,
select: function( event, ui ) {
log( ui.item ?
"Selected: " + ui.item.label :
"Nothing selected, input was " + this.value);
},
open: function() {
$( this ).removeClass( "ui-corner-all" ).addClass( "ui-corner-top" );
},
close: function() {
$( this ).removeClass( "ui-corner-top" ).addClass( "ui-corner-all" );
}
});
无论我如何处理aq后面的问号,我都会得到一个未捕获的SyntaxError:意外的令牌:'错误。如果我编码?作为'?'我得到&amp ;?在结果URL中。如果我删除了&符号,请求功能正常。 如果我在整个字符串或encodeURLComponent上使用encodeURL()?结果是%3F,它也不起作用。
我准备把头发撕掉,有人知道该怎么办吗?
答案 0 :(得分:2)
错误实际上源于参数名称不匹配,而不是?
中的url
。
有争议的参数是指定JSONP回调的参数:
http://.../aq?query=San%20F&callback=jQuery111___140___&ts=12345
// ^^^^^^^^
并且,jQuery的默认名称为callback
isn't what the API is expecting:
cb JSONP callback method name
要更改参数,您可以在请求选项中包含jsonp: 'cb'
。
$.ajax({
url: "http://autocomplete.wunderground.com/aq?query=San%20F",
dataType: "jsonp",
jsonp: 'cb',
// ...
});
而且,语法错误来自响应。如果没有cb
参数,该服务将使用JSON进行响应,缺少“ Padding ”以使其成为JSONP。
{"RESULTS": ...}
// ^ syntax error
jQuery111___140___({"RESULTS": ... });
// with padding
请注意,JSONP实际上是JavaScript,并且使用<script>
元素进行请求。它只是利用了两种语言在语法上的相似之处。但是,它需要填充有效。
答案 1 :(得分:0)
感谢所有帮助。 (我知道我不应该这么说但是......)
答案有两个: 如上所述,需要`jsonp:'cb',
的回调行以及数据部分而不是:
name_startsWith: request.term
它需要:
query: request.term
我不明白数据部分的正确语法。