При нажатии на кнопку инициализируется функция, которая отправляет на node.js express get запрос, который в ответ присылает массив с названиями городов, массив состоит из 10969 элементов ["Москва", "Абрамцево", "Алабино", "Апрелевка", "Архангельское", "Ашитково", "Байконур", "Бакшеево", "Балашиха", "Барыбино", "Белоомут", "Белые Столбы", "Бородино", "Бронницы", "Быково", "Валуево", "Вербилки", "Верея", "Видное", "Внуково", "Вождь Пролетариата" …].
var citiesList;
function loadCitiesNames() {
$.ajax({
url: "http://localhost:3000/cities/get",
type: 'GET',
crossDomain: true,
dataType: 'jsonp',
contentType: 'application/json; charset=utf-8',
success: function (data) {
citiesList = data;
console.log(citiesList);
},
error: function(request,msg,error){
console.log(request + ' ' + msg + ' ' + error);
}
});
}
Так соответственно выглядит серверная часть
router.get('/get', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.contentType('json');
res.setHeader('Content-Type', 'application/json');
var data = JSON.parse(fs.readFileSync('cities.json'),'utf8');
var cities = data.city;
var citiesNames = [];
for (var i = 0; i < cities.length; i++) {
citiesNames.push(cities[i].name);
}
res.jsonp(citiesNames);
});
module.exports = router;
Затем этот массив записывается в переменную, которая и служит источником для autocomplete.
$('#cityInput').autocomplete({source: citiesList, appendTo: this})
Сам инпут находится в модальном окне, которое кнопка вызывает
<div class="modal fade" id="weaModal" tabindex="-1" role="dialog" aria-labelledby="weaModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="weaModalLabel">Выберите город:</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<input id="cityInput" class="form-control" type="text" placeholder="Введите название города">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Отмена</button>
<button type="button" class="btn btn-primary">Сохранить</button>
</div>
</div>
</div>
</div>
При попытке ввода в инпут чего-либо в консоли возникает такая ошибка:
jquery-ui.js:6015
Uncaught TypeError: this.source is not a function
at $..._search (jquery-ui.js:6015)
at $..._search (jquery-ui.js:144)
at $...search (jquery-ui.js:6007)
at $...search (jquery-ui.js:144)
at $... (jquery-ui.js:5988)
at handlerProxy (jquery-ui.js:641)
На странице подключены:
<script src="https://code.jquery.com/jquery-3.5.0.min.js" integrity="sha256-xNzN2a4ltkB44Mc/Jz3pT4iU1cmeR0FkXs4pru/JxaQ=" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js" integrity="sha256-T0Vest3yCU7pafRw9r+settMBX6JkKN06dqBnpQ8d30=" crossorigin="anonymous"></script>
<link rel="stylesheet" type="text/css" href="./css/jquery-ui.css">