2010-10-27 71 views
1

我想實現一個自動完成文本框,其值由返回XML內容的遠程腳本生成。我使用JQuery-1.4.3和JQuery-UI-1.8.5中的自動完成小部件。jquery:遠程xml源的自動完成

我已經研究了XML data parsed once例如自動完成演示頁,並想實現的評論:

這也應該作爲對如何解析遠程XML數據源的引用 - 解析將只發生在源回調中的每個請求。

作爲一個測試,我試圖讓這個工作與提供的XML演示。上面的評論表明,自動完成'source'屬性必須用Ajax調用來替換。然而,當我在demo page提供的功能修改這個,我沒有收到與下面的自動完成功能的任何結果:

$("#birds").autocomplete({ 
    source: function(request, response) { 
    $.ajax({ 
     url: "london.xml", 
     dataType: "xml", 
     success: function(xmlResponse) { 
     var data = $("geoname", xmlResponse).map(function() { 
//alert($('name', this).text()); 
      return { 
      value: $("name", this).text() + ", " + 
        ($.trim($("countryName", this).text()) || "(unknown country)"), 
      id: $("geonameId", this).text() 
      }; 
     }).get(); 
     } 
    }) 
    }, 
    minLength: 0, 
    select: function(event, ui) { 
    log(ui.item ? 
     "Selected: " + ui.item.value + ", geonameId: " + ui.item.id : 
     "Nothing selected, input was " + this.value); 
    } 
}); 

不過,註釋掉簡單調試彈出消息顯示,Ajax調用並設法檢索用於構建數據的值。我的錯誤在哪裏?

任何幫助非常感謝!

親切的問候,

羅恩·範登布蘭登

回答

3

好吧,

我已經找到了解決方案,並能愉快地回答自己。

在我最初的嘗試中,我在Ajax函數的成功回調中聲明瞭變量'data',但沒有做任何事情。該解決方案非常簡單:添加一個response()函數,如果ajax調用成功,將返回數據變量。我將添加完整的校正功能(儘管鞋底變化是在第14行): 複製代碼

$("#birds").autocomplete({ 
    source: function(request, response) { 
    $.ajax({ 
     url: "london.xml", 
     dataType: "xml", 
     success: function(xmlResponse) { 
     var data = $("geoname", xmlResponse).map(function() { 
      return { 
      value: $("name", this).text() + ", " + 
        ($.trim($("countryName", this).text()) || "(unknown country)"), 
      id: $("geonameId", this).text() 
      }; 
     }); 
     response(data); 
     } 
    }) 
    }, 
    minLength: 0, 
    select: function(event, ui) { 
    log(ui.item ? 
     "Selected: " + ui.item.value + ", geonameId: " + ui.item.id : 
     "Nothing selected, input was " + this.value); 
    } 
}); 

當然,在這種情況下,響應可以直接構造,而無需首先聲明一個數據變量: 複製代碼

 $.ajax({ 
     url: "london.xml", 
     dataType: "xml", 
     success: function(xmlResponse) { 
     response($("geoname", xmlResponse).map(function() { 
      return { 
      value: $("name", this).text() + ", " + 
        ($.trim($("countryName", this).text()) || "(unknown country)"), 
      id: $("geonameId", this).text() 
      }; 
     })); 
     } 
    }) 
    } 

(注:在'remote XML' autocomplete demo插入時,這些功能片段工作)

唷!現在開始做一些有用的事情。

Ron