Страницы

Поиск по вопросам

воскресенье, 12 мая 2019 г.

После загрузки данных Ajax'ом отображает только последнее значение

Есть таблица, в ней много ячеек. Хочу Ajax'ом лениво выдергивать значения из базы и по готовности вставлять.
При первом обходе и рисовании таблицы на PHP собираю массив ID для дальнейшей отправки Ajax'ом.
Но отображаются данные только в последней ячейке:
$(document).ready(function() { //console.log(array); var path = ''; //путь к контролеру for (var i = 0; i < array.length; i++) { var elem = array[i]; var url = path + "ajaxAll?val=" + encodeURIComponent(elem); console.log(elem, url); $.ajax({ type: "POST", url: url, dataType: "json", success: function(data) { //alert ($id); document.getElementById(elem).innerHTML = data; //запись в ячейку } }) // document.getElementById(elem).innerHTML = elem; //так нормально пишет в нужную ячейку }

пример array
["37_2015-06-1_1_2", "38_2015-06-1_1_2", "39_2015-06-1_1_2", "58_2015-06-1_1_2", "62_2015-06-1_1_2", "66_2015-06-1_1_2", "37_2015-06-2_1_2", "38_2015-06-2_1_2", "39_2015-06-2_1_2"]
то есть ид все есть. да и document.getElementById(elem).innerHTML = elem; нормально данные вставляет
innerHTML += записал все ответы в одну последнюю ячейку. то есть ajax запрос идет, а вот ид он берет последний


Ответ

Хотите я Вам фокус покажу?
for (var i = 0; i < 10; i++) { var elem = i; window.setTimeout(function(){ console.log(elem) },1000); }
Вы думаете данный код вернет последовательность от 0 до 9? А вот и не угадали, он вернет Вам десять раз девятку. точно так же, как ваш код вставит все данные в только в конечный elem, а не по последовательности. Это связанно с областями видимости, да данный момент возникает замыкание на внешний контекст.
Спасибо @Regent за подсказку, код можно изменить так, обернув функцию и разорвав замыкание:
success: (function (elem){ return function(data) { document.getElementById(elem).innerHTML = data; }})(elem)

Комментариев нет:

Отправить комментарий