2

我已经阅读和测试了很多关于它的内容,并且无法通过我创建的 REST 服务来使用 JSONP的JQuery 自动完成功能。

这是我的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 自动完成示例代码在没有任何回调函数的情况下工作,最重要的是为什么下拉结果表单自动完成不显示。为了使下拉自动完成功能起作用,我应该如何处理回调函数?

谢谢大家,丹尼尔

4

1 回答 1

1

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

我会离开这个:

data: {
   jsonCallback : "p"

但这意味着您的 REST 服务需要更智能一些,并获取 jsonCallback cgi 参数并将该值用作 json 的函数包装器。

更新@Daniele

回复:“我怎么知道 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 ')';
  ?>
于 2012-05-08T19:59:50.840 回答