D'abord, je vais poster le code:
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();
}
});
}
});
});
Et voici une solution jsFiddle Je l'ai testé
http://jsfiddle.net/pinusnegra/KFHnd/
Il est un peu désordonné, mais vous pouvez faire mieux si vous voulez. Je vous le dis comment cela fonctionne:
D'abord, vous recevez une liste de nœuds « de toponyme » Je pense, non seulement un:
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();
Vous obtenez la valeur NAME_EN et name_fr, et que vous définissez la « valeur 'à une chaîne vide (la' valeur 'sera le texte de saisie semi-automatique jQuery).
En jQuery autocomplete, vous pouvez définir une fonction sur la source, qui a un objet 'req' et un rappel 'add'. L'objet 'req' contient une propriété 'term', qui est l'entrée réelle de la zone de texte. Le rappel 'add' ajoute une liste (un tableau) des éléments correspondants.
Vous initialiser un tableau « source »:
source: function(req, add) {
var source = [];
vous itérer sur le tableau « données », et en fonction du courant « lang », la configuration de la « valeur » propriété avec la réelle « NAME_EN 'ou' name_fr '.
Après cela, vous pouvez tester sur le « object.value », si elle est correspond aux exigences:
if (data[i].value.substr(0, req.term.length).toLowerCase() == req.term.toLowerCase())
{
source.push(data[i]);
}
le cas échéant, puis poussez dans le tableau « source ».
et ... ajouter (source); 'renvoie' la liste actuelle.
Notez que la fonction de source de l'objet autocomplete sera appelé à chaque fois quand une nouvelle recherche de saisie semi-automatique se produit, de sorte que vous retournez la collection d'objets à chaque fois à droite.
Bien sûr, vous pouvez faire une solution plus sophistiquée et optimisée si celui-ci répond à vos besoins.
acclamations, negra
return { \t valeur: $ ("name_fr", this) .text(), Désolé, ont maintenant. :) – user2075215