Звучит так, как будто вы столкнулись с проблемой, описанной здесь: Создание замыканий в циклах: распространенная ошибка
Причина, по которой вы получаете undefined
при вызове alert
, заключается в том, что при вызове функции autocomplete
ваш цикл for завершил выполнение, означая, что ваша переменная цикла i
имеет значение 2 то есть ids.length + 1
. Следовательно, ids[i]
- это то же самое, что и ids[2]
, которого не существует, поскольку в вашем массиве ids
есть только 2 элемента. Я попытался создать простую демонстрацию этого поведения, чтобы проиллюстрировать, что происходит: http://jsfiddle.net/ianoxley/KwXVs/1/ (для просмотра результатов вам нужно будет открыть консоль браузера).
Если вы создадите дополнительное закрытие, которое должно помочь сохранить ваш прицел и избавиться от undefined
(см. http://jsfiddle.net/ianoxley/BVa5Q/).
Если вы попытаетесь изменить свой код на что-то вроде этого, надеюсь, это избавит от проблемы:
$(document).ready(function () {
function initAutocomplete(element_id) {
$("#" + element_id).autocomplete({
source: function (request, response) {
alert(element_id); // <---
$.getJSON('/search_db/' + element_id, request, function (data_from_server) {
var suggestions = [];
var len = data_from_server.length;
for (var i = 0; i < len; i++) {
suggestions.push(data_from_server[i]);
}
response(suggestions);
});
}
});
}
var ids = ['str', 'num'];
for (var i = 0; i < ids.length; i++) {
var current_id = ids[i];
initAutocomplete(current_id);
}
});
Надеюсь, это поможет.