#javascript #ajax #json #jquery
#javascript #ajax #json #jquery
Вопрос:
Это мой пример ответа JSON:
[{"id":11137,"name":"Agra"},{"id":11138,"name":"Albizzate"}]
и мне нужно выполнить итерацию каждого объекта массива и распечатать id
и name
:
$.ajax({
url: '{{ path('ajax_provinces') }}',
type: 'POST',
dataType: 'json',
data: {region_id: this.value},
success: function(provinces) {},
error: function() { alert("error"); },
complete: function(provinces) {
$('select#regions ~ span > img').fadeOut('slow');
$.each(provinces, function(key, val) {
alert(key ": " val);
});
}
});
Проблема в том, что я получаю странные результаты: имена функций, тела функций и другие внутренние данные из jQuery. Похоже, что он перебирает функции библиотеки jQuery! Есть какие-нибудь подсказки, что происходит?
Ответ №1:
Проблема в том, что complete
обратный вызов не передает возвращенные данные в качестве аргумента:
завершено (jqXHR, textStatus)
Функция, вызываемая при завершении запроса (после выполнения успешных и ошибочных обратных вызовов). Функции передаются два аргумента: Объект jqXHR (в jQuery 1.4.x, XMLHttpRequest) и строка, классифицирующая статус запроса («успех», «не изменен», «ошибка», «тайм-аут», «прерывание» или «ошибка синтаксического анализа»).
Предположительно, странные ключи / значения, которые вы видите, являются атрибутами jqXHR
объекта.
Вам нужно обрабатывать возвращаемые данные в success
, а не complete
. Насколько я понимаю, complete
это обычно используется для действий, которые должны выполняться независимо от того, успешно ли запрос AJAX вернул данные (например, скрытие анимации загрузки).
Ответ №2:
Вам нужно обработать возвращенные данные успешно, а не завершить. Complete используется, когда вам нужно запустить функцию после завершения вызова AJAX. В случае успеха вы получите данные, отправленные с сервера в виде
success:function(data){
/// data is JSON object. Now iterate it here
var i;
for(i in data){
alert('the Id =' data['id'] ' the name ' data['name']);
}
}