#javascript #jquery #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 запрос идет, а вот ид он берет последний
Ответы
Ответ 1
Хотите я Вам фокус покажу? 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)Ответ 2
Лучше изменить метод так, чтобы он возвращал все необходимые значения сразу. 100 ajax запросов от каждого пользователя может создать значительную нагрузку для сервер. UPD: В примере elem объявлен в замыкании, после ответа сервера значение elem будет последним (т. е. elem = array[array.length - 1] для каждого ответа). Чтоб избежать этого можно использовать $.proxy ... success: $.proxy(function(data){ $(this).append(data); }, elem) ... В данном случае this будет указывать на elem
Комментариев нет:
Отправить комментарий