Во-первых, используемый вами источник данных не поддерживает JSONP .Вы не можете просто взять произвольный источник данных JSON и сказать jQuery, что это JSONP, и ожидать, что он будет работать.Сервер должен быть настроен на прием аргумента обратного вызова, который он добавляет к ответу, вызывая ваш код, когда он завершается и внедряется на страницу.
Это можно обойти, используя YQL или написание собственного серверного кода, который вызывает службу.
Вот пример использования YQL:
function buildQuery(term) {
return "select * from json where url = 'http://airportcode.riobard.com/search?fmt=JSON&q=" + encodeURI(term) + "'";
}
function makeRequest(request, response) {
$.ajax({
url: 'http://query.yahooapis.com/v1/public/yql',
data: {
q: buildQuery(request.term),
format: "json"
},
dataType: "jsonp",
success: function(data) {
var airports = [];
if (data && data.query && data.query.results && data.query.results.json && data.query.results.json.json) {
airports = data.query.results.json.json;
}
response($.map(airports, function(item) {
return {
label: item.code + (item.name ? ", " + item.location : "") + ", " + item.location,
value: item.code
};
}));
},
error: function () {
response([]);
}
});
}
$(document).ready(function() {
$("#airport").autocomplete({
source: makeRequest,
minLength: 2
});
});
Поэтому вместо прямого вызова веб-службы мы попросим YQL сделатьзапрос и вернуть результат.YQL действует как оболочка, делая недоступный в противном случае веб-сервис, доступный через JSONP.
В методе success
нам нужно пройти через несколько свойств, чтобы наконец получить доступ к данным.После этого мы можем отформатировать результаты так, как ожидает виджет автозаполнения (с $.map
).
Пример: http://jsfiddle.net/BQxw4/40/