传递问题'?'在URL中的ajax调用

时间:2014-05-29 21:31:39

标签: javascript jquery ajax

我正在尝试创建一个对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,它也不起作用。

我准备把头发撕掉,有人知道该怎么办吗?

2 个答案:

答案 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',

    // ...
});

示例:http://jsfiddle.net/X2JEA/


而且,语法错误来自响应。如果没有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

我不明白数据部分的正确语法。

相关问题