2012-06-21 310 views
1

我想重複這個,http://jqueryui.com/demos/autocomplete/#remote-jsonp。只是,而不是查詢geonames.org服務器,我想查詢我自己的。麻煩的是,教程沒有提及任何關於geonames在他們結束時所做的事情。jQuery和PHP的jquery自動完成

我嘗試過它並獲取$ _POST變量,但我想我不明白ajax傳遞的是什麼。 $ _POST ['name_startsWith']不存在,這似乎是傳遞。任何人都可以啓發我發送的信息是什麼樣的?

此外,本教程是關於jsonp,而不是json。那有多重要?

回答

2

JSONP與JSON完全不同。正如其他人所說,JSONP是一個跨服務器。

JSON是從您自己的服務器獲取數據的更好方法,並且在所有瀏覽器上翻譯和工作都更容易。

返回什麼是相對格式下一個項目數組:

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

標籤被用作顯示名稱,除非你帶來額外的數據傳回像一個ID將是用來唯一數據選擇自動完成中的項目。

使用功能,如select你可以採取ui.item.id(標識將與您的陣列回來如上定義),並用它來選擇,用以執行進一步的AJAX功能列表的唯一項目。

編輯:

使用傳遞支持瓦爾改變,你需要編寫自己的displayMenuItem功能,利用從上述定義的數組瓦爾菜單的顯示。

Fruther編輯:

他們真正做到這一點的方法是兩面。遠程服務器只傳回一個echo'ed JSON格式的數組,就像上面定義的數組一樣(除了標頭)。之後,JQuery只是將數組排序並填充數據。

因此,在這樣做的PHP的例子:

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

字面上這就是它在遠程服務器端...

再次編輯我忘了回調發送機智JSONP

2

jsonp僅適用於向外部服務器(跨源)請求。返回的是該呼叫的JSON對象。

如果您要向自己的服務器發送請求,只需使用Content-Type: application/json的正常請求。查看演示遠程數據源遠程高速緩存。那些可能是你盟友的更多。

+0

它實際上是一個phonegap應用程序。我認爲這將符合跨性別的原則。我希望我可以使用其他教程。他們更有意義。感謝您的答覆! – davimusprime

1

使用Firefox和一個名爲Firebug的插件。 使用'網絡'視圖面板。

我看到傳遞以下數據:

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

請求的URL是this one。在那裏你可以看到JSON是如何形成的。

1

這可能是您正在尋找的geonames的文檔:http://www.geonames.org/export/geonames-search.html

如果您嘗試其中一個示例鏈接,您應該看到al ist of geonames elements。每一個都包含以下屬性:name,adminName1countryName,這是本例中顯示的內容。

jsonp如果您從另一個主機請求的數據不是您的頁面所服務的數據,則這一點非常重要。如果你想打電話給你自己的服務,您可以使用簡單的json

1

JSON VS JSONP

JSON和JSONP之間的區別是怎樣的JSON從服務器返回。使用常規JSON,服務器將以標準響應格式返回純JSON。使用JSONP,服務器將返回一個JavaScript文檔,其中包含一個函數調用,並將JSON數據傳遞給您發送給服務器的函數名稱。

樣品JSON從服務器返回

JSON: {名稱:數據}

JSONP: 使用functionName({名稱:數據});

當使用JSONP VS JSON

使從www.name.com查詢到www.other.com使用JSONP。

從www.name.com到www.name.com使用常規JSON進行查詢。 $ _GET [ 'name_startsWith']或$ _REQUEST [ 'name_startsWith']:

自動完成插件

至於你的其他問題,由自動完成插件發送的變量作爲GET變量,所以使用被髮送。 (REQUEST會檢查GET和POST)。

1

一些基本規則,讓您開始寫自己的JSON服務:

  • 如果你希望其他網站,就能消耗你的數據,那麼你需要實現JSONP;兩種JSONP/JSON都可以使用。 JSONP機制繞過same origin policy的問題。

  • 如果您希望其他網站能夠使用您的數據,那麼您的腳本應該通過查詢字符串接受參數;查詢字符串和表單變量都可以使用。

  • 對於JSON請求,您的服務器需要發出JSON編碼的數據。數據必須以內容類型application/json發送。例如PHP代碼:

header("Content-type: application/json"); 
echo json_encode(array("foo" => "bar")); 
// {"foo":"bar"} 
  • 對於JSONP請求,服務器需要發出一個包裹JavaScript函數調用和內容類型text/javascript內JSON數據。例如PHP代碼:
header("Content-type: text/javascript"); 
echo "callback("; 
echo json_encode(array("foo" => "bar")); 
echo ");"; 
// callback({"foo":"bar"}); 
  • 通常你抓住從GET/POST變量而不是硬編碼的回調函數的名稱。

  • 實際上,JSONP請求是使用<script src>標籤生成的;而JSON請求則使用XML HTTP請求進行。