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 オブジェクトは、

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 の関数ラッパーとして使用する必要があることを意味します。

更新@ダニエル

Re: 「Jquery がコールバック関数に割り当てるランダムな名前を知るにはどうすればよいですか?」

これは、REST サービスに使用しているプログラミング言語によって異なります。Perl と PHP の 2 つの例を次に示します。

#!/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 に答える