1

これを複製しようとしています、http://jqueryui.com/demos/autocomplete/#remote-jsonp。ただ、geonames.orgサーバーにクエリを実行する代わりに、自分のサーバーにクエリを実行したいと思います。問題は、チュートリアルでは、geonamesが最後に何をしているのかについて何も言及していないことです。

私はそれをウィングして$_POST変数を取得しようとしましたが、ajaxが何を渡しているのか理解できないと思います。$_POST['name_startsWith']は存在しません。これは渡されているようです。送信された情報がどのように見えるかについて誰かが私に教えてもらえますか?

また、チュートリアルはjsonではなくjsonpに関するものです。それはどれほど重要ですか?

4

6 に答える 6

2

JSONPであり、JSONとはかなり異なります。他の人が言うように、JSONPは1つのクロスサーバーです。

JSONは、独自のサーバーからデータを取得するための優れた方法であり、すべてのブラウザーで変換して機能させるのがはるかに簡単です。

返されるのは、次の相対形式のアイテム配列です。

[{label: '', description: ''}, { //etc }]

ラベルは表示名として使用され、IDなどの追加データを戻さない限り、オートコンプリートでアイテムを選択するために使用される唯一のデータになります。

次のような関数を使用するselectui.item.id(idは上記で定義した配列で返されます)、それを使用してリストから一意のアイテムを選択し、さらにAJAX関数を実行できます。

編集:

displayMenuItemパスバック変数を使用してメニューの表示を変更するには、上記で定義した配列の変数を利用する独自の関数を作成する必要があります。

さらに編集:

彼らが実際にこれを行う方法は両面です。リモートサーバーは、上記で定義されたものと同様に、エコーされたJSON形式の配列を返すだけです(ヘッダーを除く)。その後、JQueryは配列を並べ替えてデータを入力します。

したがって、これを行うPHPの例:

echo json_encode(array('name' => 'whoop'));

そして文字通り、リモートサーバー側ではこれで終わりです...

もう一度編集しますJSONPで送信されたコールバックを忘れました

于 2012-06-21T20:57:39.737 に答える
2

jsonp外部サーバー(クロスオリジン)へのリクエスト専用です。JSONその呼び出しからのオブジェクトが返されます。

自分のサーバーにリクエストを送信する場合は、通常のリクエストを使用してくださいContent-Type: application/jsonデモのリモートデータソースキャッシュ付きリモートをチェックしてください。それらはおそらくあなたの味方です。

于 2012-06-21T20:52:06.067 に答える
1

これはおそらくあなたが探しているgeonamesからのドキュメントです:http://www.geonames.org/export/geonames-search.html

サンプルリンクの1つを試すと、geonames要素のリストが表示されます。それぞれに、特に、プロパティ:nameadminName1およびが含まcountryNameれています。これは、この例で表示されるものです。

jsonpページが提供されているホスト以外のホストからデータを要求する場合は重要です。あなたがあなた自身のサービスを呼ぶつもりなら、あなたは簡単に使うことができますjson

于 2012-06-21T20:58:14.737 に答える
1

FirefoxとFirebugというプラグインを使用します。「ネット」ビューパネルを使用します。

次のデータが渡されているのがわかります。

_            1340311947284
callback    jQuery17206118978844942496_1340311935530
featureClass    P
maxRows 12
name_startsWith atlanta
style   full

要求されたURLはこれです。ここで、JSONがどのように形成されるかを確認できます。

于 2012-06-21T20:54:30.187 に答える
1

JSONとJSONP

JSONとJSONPの違いは、JSONがサーバーから返される方法です。通常のJSONでは、サーバーは標準の応答形式でプレーンJSONを返します。JSONPを使用すると、サーバーは、サーバーに送信する関数名に渡されたJSONデータを含む関数呼び出しを含むjavascriptドキュメントを返します。

サーバーから返されたサンプルJSON

JSON:{名前:データ}

JSONP:functionName({name:data});

JSONPとJSONをいつ使用するか

www.name.comからwww.other.comにクエリを実行するには、JSONPを使用します。

www.name.comからwww.name.comにクエリを実行するには、通常のJSONを使用します。

オートコンプリートプラグイン

他の質問に関しては、オートコンプリートプラグインによって送信される変数はGET変数として送信されるため、$ _GET['name_startsWith']または$_REQUEST['name_startsWith']を使用します。(REQUESTはGETとPOSTの両方をチェックします)。

于 2012-06-21T21:02:11.297 に答える
1

独自のJSONサービスの作成を開始するための基本的なルールはいくつかあります。

  • 他のWebサイトでデータを利用できるようにする場合は、JSONPを実装する必要があります。それ以外の場合は、JSONP/JSONの両方を使用できます。JSONPメカニズムは、同一生成元ポリシーの問題を回避します。

  • 他のWebサイトでデータを使用できるようにする場合は、スクリプトがクエリ文字列を介してパラメーターを受け入れる必要があります。それ以外の場合は、クエリ文字列変数とフォーム変数の両方を使用できます。

  • JSONリクエストの場合、サーバーはJSONでエンコードされたデータを送信する必要があります。データはコンテンツタイプで送信する必要がありますapplication/json。PHPコードの例:

header("Content-type: application/json");
echo json_encode(array("foo" => "bar"));
// {"foo":"bar"}
  • JSONPリクエストの場合、サーバーはJavaScript関数呼び出しとコンテンツタイプ内にラップされたJSONデータを出力する必要がありますtext/javascript。PHPコードの例:
header("Content-type: text/javascript");
echo "callback(";
echo json_encode(array("foo" => "bar"));
echo ");";
// callback({"foo":"bar"});
  • 通常、ハードコーディングではなく、GET/POST変数からコールバック関数の名前を取得します。

  • 実際には、JSONPリクエストは<script src>タグを使用して生成されます。一方、JSONリクエストはXMLHTTPリクエストを使用して行われます。

于 2012-06-21T21:09:28.653 に答える