JSONP和JQUERY自动完成

时间:2012-05-08 13:37:51

标签: jquery jsonp jquery-ui-autocomplete

我一直在阅读和测试很多关于它的内容,并且无法通过我创建的REST服务使JQuery Autocomplete与JSONP一起工作。

这是我的javascript:

$( "#input" ).autocomplete({
        source: function( request, response ) {
            $.ajax({
                url: "http://localhost:8080/Rest/api/suggest/",
                dataType: "jsonp",
                data: {
                    jsonpCallback : "p",
                    q: request.term
                },
                success: function( data ) {

                    response( $.map( data.suggestions, function( item ) {
                        return {
                            label: item.LABEL,
                            value: item.URI
                        }
                    }));
                }
            });
        },
        minLength: 2
});

JSONP对象将是包含在

中的标准JSON对象
p({});

通过?jsonpCallback = p给REST API提供的回调函数。 javascript / html代码在http://localhost:8888服务器下本地运行。

要查看数据响应,我需要在我的javascript中定义“p”回调函数

 function p(data){
        alert(data.toSource());
    }

如果我取消它没有任何作用,但我不明白的是为什么JQuery Autocomplete示例代码在没有任何回调函数的情况下工作,并且最重要的是为什么自动完成的下拉结果不显示。我应该怎么做回调函数才能使下拉自动完成功能起作用?

谢谢大家, 丹尼尔

1 个答案:

答案 0 :(得分:1)

我相信jQuery会自动附加jsonCallback =?当数据类型为'jsonp'时。它使用随机数作为回调函数名称,但在这种情况下,success:函数用作回调函数。您的函数p()是否曾被调用过?它也不应该被引用。它是一个函数引用,而不是字符串。

我不想这样做:

data: {
   jsonCallback : "p"

但这意味着你的REST服务需要更聪明一些,并获取jsonCallback cgi参数并使用该值作为json的函数包装器。

更新@Daniele

Re:“我如何知道Jquery为回调函数分配的随机名称?”

这取决于您使用的REST服务编程语言。这是两个例子,Perl和PHP:

#!/usr/bin/perl
use CGI ":cgi";
$jsonCallback = $q->param('jsonCallback');
$json = ...
print header(
    -type => 'application/json'
);

print $jsonCallback . '(' if $jsonCallback;
print $json;
print ')' if $jsonCallback

PHP

 <?php
     $jsonCallback = $_GET['jsonCallback'];
     $json = ...
     echo $jsonCallback . '(';
     echo $json;
     echo ')';
  ?>