Jquery или Javascript: автозаполнение из JSON для нескольких полей формы
У меня есть форма с полем ввода текста с именем "Building_N"; Форма также имеет несколько скрытых полей, которые необходимо заполнить из внешнего файла JSON. В настоящее время файл представляет собой текстовый файл с данными, такими как:
[
{
"buildingname":"building1",
"floorplanlayer":"floorurl",
"roomlayer": "roomurl",
},
{
"buildingname":"building1",
"floorplanlayer":"floorurl",
"roomlayer": "roomurl",
}
]
Я хотел бы использовать либо JQUERY, либо javascript, чтобы позволить пользователям выбирать значение 'buildingname' и, если они это выбирают, заполнять скрытые поля значениями 'floorplanlayer' и 'roomlayer'.
Я не нашел ни одного примера, который позволил бы мне сделать это. Самое близкое, что я обнаружил, - это использование события Onkeyup для загрузки данных JSON, а затем сопоставления с помощью регулярного выражения, но это не давало пользователям возможности выбирать, а также выбирать при первом сопоставлении символов.
Спасибо!
2 ответа
Взгляните на эту популярную библиотеку автозаполнения: https://github.com/devbridge/jQuery-Autocomplete
Это более надежно, чем автозаполнение традиционного пользовательского интерфейса jQuery. Вот как я бы пошагово решил проблему, используя API, предоставляемый библиотекой:
- Разобрать файл JSON в объект JavaScript.
- Создайте массив из всех
buildingname
ценности. - В опциях автозаполнения установите
lookup
атрибут вашего построенного массива. - Установить
onSelect
атрибут функции обратного вызова, которая находит объект, связанный сbuildingname
они выбрали и установили скрытые поля здесь.
Это должно сделать то, что вы пытаетесь выполнить, намного проще, чем самостоятельно заниматься автозаполнением.
Вот как я заставил это работать; Обратите внимание, что автозаполнение возвращает все значения, потому что до сих пор я не могу найти способ, чтобы данные JSON соответствовали только начальному слову. Но я думаю, что это будет для другого вопроса:
$("#Building_N").autocomplete({
open: function(){
setTimeout(function () {
$('.ui-autocomplete').css('z-index', 99999999999999);
}, 0);
},
source: function( request, response ) {
$.ajax({
url: "_buildingdata.txt",
dataType: "json",
data: {term: request.term},
success: function(data) {
response($.map(data, function(item) {
return {
label: item.buildingname,
value: item.buildingname,
hidroom: item.roomlayer,
hidfloor: item.floorplanlayer
};
}));//response
}//success
});//ajax
},//source
minLength: 3,
select: function(event, ui) {
console.dir(ui);
$('#Building_N').val(ui.item.buildingname);
$('#hid_roomdata_layer').val(ui.item.hidroom);
$('#hid_floorplan_layer').val(ui.item.hidfloor);
}
});