Сначала я выложу код:
HTML
<select id="lang">
<option value="en">EN</option>
<option value="fr">FR</option>
</select>
<input type="text" id="results" />
<span id="foo" />
XML
<list>
<geoname>
<name_en>The Tower of London</name_en>
<name_fr>Example text</name_fr>
<lat>51.5082349601834</lat>
<lng>-0.0763034820556641</lng>
<geonameId>6286786</geonameId>
<countryCode>GB</countryCode>
<countryName>United Kingdom</countryName>
<fcl>S</fcl>
<fcode>CSTL</fcode>
<web>http://www.exmaple.com</web>
</geoname>
<geoname>
<name_en>En name</name_en>
<name_fr>Fr name</name_fr>
<lat>51.5082349601834</lat>
<lng>-0.0763034820556641</lng>
<geonameId>6286786</geonameId>
<countryCode>GB2</countryCode>
<countryName>United Kingdom</countryName>
<fcl>S</fcl>
<fcode>CSTL</fcode>
<web>http://www.exmaple.com</web>
</geoname>
</list>
JS
jQuery(document).ready(function() {
var lang = "en";
$("#lang").bind("change", function() {
lang = this.value;
});
$.ajax({
url: "/echo/xml/",
dataType: "xml",
success: function( xmlResponse ) {
var data = $("geoname", xmlResponse ).map(function() {
return {
value: "",
name_en: $( "name_en", this ).text(),
name_fr: $("name_fr", this).text(),
id: $( "geonameId", this ).text(),
countryName: $( "countryName", this ).text(),
link: $( "web", this ).text(),
code: $( "countryCode", this ).text()
};
}).get();
$( "#results" ).autocomplete({
source: function(req, add) {
var source = [];
for (var i = 0; i < data.length; i++)
{
if (lang == "en")
{
data[i].value = data[i].name_en;
}
else if (lang == "fr")
{
data[i].value = data[i].name_fr;
}
if (data[i].value.substr(0, req.term.length).toLowerCase() == req.term.toLowerCase())
{
source.push(data[i]);
}
}
add(source);
},
minLength: 0,
select: function( event, ui ) {
$('#foo').html('');
$('#foo').html(ui.item.code).slideDown();
}
});
}
});
});
А вот решение, которое я протестировал JSFiddle
http://jsfiddle.net/pinusnegra/KFHnd/
Это немного грязно,но вы можете сделать это лучше, если хотите.Я расскажу вам, как это работает:
Сначала вы получаете список узлов «geoname», я думаю, не только один:
var data = $("geoname", xmlResponse ).map(function() {
return {
value: "",
name_en: $( "name_en", this ).text(),
name_fr: $("name_fr", this).text(),
id: $( "geonameId", this ).text(),
countryName: $( "countryName", this ).text(),
link: $( "web", this ).text(),
code: $( "countryCode", this ).text()
};
}).get();
Вы получаете значения name_en и name_fr, и выустановите 'value' в пустую строку ('value' будет текстом автозаполнения jQuery).
В автозаполнении jQuery вы можете установить функцию для источника, который имеет объект 'req', иобратный вызов «добавить».
Объект 'req' содержит свойство 'term', которое является фактическим вводом текстового поля.Обратный вызов 'add' добавляет список (массив) соответствующих элементов.
Таким образом, вы инициализируете массив 'source':
source: function(req, add) {
var source = [];
, затем вы перебираете массив 'data'и, основываясь на текущем 'lang', установите свойство 'value' с фактическим 'name_en' или 'name_fr'.
После этого вы можете проверить на object.value, если оно совпадаеттребования:
if (data[i].value.substr(0, req.term.length).toLowerCase() == req.term.toLowerCase())
{
source.push(data[i]);
}
, если так, то вставьте массив 'source'.
и ... add (source);'возвращает' фактический список.
Обратите внимание, что функция источника объекта автозаполнения будет вызываться каждый раз, когда происходит новый поиск автозаполнения, поэтому вы каждый раз возвращаете нужную коллекцию элементов.
OfКонечно, вы можете сделать более сложное и оптимизированное решение, если оно соответствует вашим требованиям.
ура, negra