JQuery从XML自动完成
我正在玩jquery ui autocomplete。 并且有一个关于如何查询XML数据的问题。 我有一个包含位置列表的XML文件,类似于:
The Tower of London Example text 51.5082349601834 -0.0763034820556641 6286786 GB United Kingdom S CSTL http://www.exmaple.com
我的jQuery是:
jQuery(document).ready(function() { lang = 'en'; $.ajax({ url: "places.xml", dataType: "xml", success: function( xmlResponse ) { var data = $( "countryCode", xmlResponse ).map(function() { return { value: $( "name", this ).text(), id: $( "geonameId", this ).text(), countryName: $( "countryName", this ).text(), link: $( "web", this ).text(), code: $( "countryCode", this ).text() }; }).get(); $( "#results" ).autocomplete({ source: data, minLength: 0, select: function( event, ui ) { $('#foo').html(''); $('#foo').html(ui.item.code).slideDown(); } }); } }); });
我遇到的问题是,我想指定一个变量,当我将其设置为EN时,只搜索name_en,而在其他情况下,只有在设置为FR时才搜索name_fr。 当我将语言设置为EN时,我不希望name_fr结果返回。 提前致谢。
首先,我将发布代码:
HTML
XML
The Tower of London Example text 51.5082349601834 -0.0763034820556641 6286786 GB United Kingdom S CSTL http://www.exmaple.com En name Fr name 51.5082349601834 -0.0763034820556641 6286786 GB2 United Kingdom S CSTL http://www.exmaple.com
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'对象和'add'回调。
'req'对象包含'term'属性,它是实际的文本框输入。 'add'回调添加匹配项的列表(数组)。
所以你初始化一个'源'数组:
source: function(req, add) { var source = [];
然后迭代'data'数组,并根据当前'lang',使用实际的'name_en'或'name_fr'设置'value'属性。
在此之后,您可以测试'object.value',如果它符合要求:
if (data[i].value.substr(0, req.term.length).toLowerCase() == req.term.toLowerCase()) { source.push(data[i]); }
如果是这样,那么请进入'source'数组。
和...添加(来源); '返回'实际列表。
请注意,每次发生新的自动完成搜索时,都会调用自动完成对象的源函数,因此您每次都会返回正确的项集合。
当然,如果这个解决方案符合您的要求,您可以制作更复杂和优化的解决方案。
欢呼,内格拉