Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.01.2010, 20:09
Аспирант
Отправить личное сообщение для Neokortex Посмотреть профиль Найти все сообщения от Neokortex
 
Регистрация: 29.01.2010
Сообщений: 39

Вывод Ajax ответов в цикле - проблема
Привет. У меня вот тут проблема есть. Функция пробегает по массиву, если совпадает условие выполняет XMLHttpRequest запрос к php скрипту, который выводит результат работы.

Так вот в чем проблема: GET запросы совершаются, а вывод результатов - нет. И что за ерунда никак не пойму. Целый день бьюсь над этим куском кода. Помогите пожалуйста.

function remove_categ(id_categ){
        // ОБРАБОТКА ЗАПРОСОВ К СКРИПТУ ПО ОДНОМУ

        // выводим надпись в блоке результатов
        document.getElementById('script_results').innerHTML = 'Переносим в ' + id_categ + ' следующие категории:<br />';

        // создаем цикл по всем чекбоксам
        for (var r = document.getElementsByName('remove_checkbox'), j = 0, l = r.length; j < l; j++) {

	// если чекбокс выделен выполняем следующее
            if (r[j].checked == true) {

                // создаем XMLHttpRerquest запрос
                var request_remove = false;
                try {
                    request_remove = new XMLHttpRequest();
                } 
                catch (trymicrosoft) {
                    try {
                        request_remove = new ActiveXObject("Msxml2.XMLHTTP");
                    } 
                    catch (othermicrosoft) {
                        try {
                            request_remove = new ActiveXObject("Microsoft.XMLHTTP");
                        } 
                        catch (failed) {
                            request_remove = false;
                        }
                    }
                }
                if (!request_remove) 
                    alert("Error initializing XMLHttpRequest!");

                // обращение к php скрипту
                 var url = "remove_category.php?kakoi=" + r[j].value + "&kuda=" + id_categ;                  
                request_remove.open("GET", url, true);
				
                request_remove.onreadystatechange = function(){ 

                    // если ответ есть обновляем содержимое в блоке результатов
                    if (request_remove.readyState == 4) { 
                        var out = request_remove.responseText; 
                        document.getElementById("script_results").innerHTML = out + document.getElementById("script_results").innerHTML; // соединяем старые результаты с новыми (формирование отчета "на лету")  
                    };  
                            };  

                request_remove.send(null);
            };
            };
        };


Так вот все работает, а результат выводит только по последнему запросу

Последний раз редактировалось Neokortex, 29.01.2010 в 20:31.
Ответить с цитированием
  #2 (permalink)  
Старый 30.01.2010, 00:57
Аватар для Мараторий
Кандидат Javascript-наук
Отправить личное сообщение для Мараторий Посмотреть профиль Найти все сообщения от Мараторий
 
Регистрация: 22.01.2010
Сообщений: 114

Вы используете один и тот же объект XMLHttpRerquest.
Ответить с цитированием
  #3 (permalink)  
Старый 30.01.2010, 10:47
Аспирант
Отправить личное сообщение для Neokortex Посмотреть профиль Найти все сообщения от Neokortex
 
Регистрация: 29.01.2010
Сообщений: 39

спасибо за ответ. но так как я новичек в javascript, мою проблему это никак не решает
Ответить с цитированием
  #4 (permalink)  
Старый 31.01.2010, 17:38
Аватар для mycoding
NodeJS developer - ушел
Отправить личное сообщение для mycoding Посмотреть профиль Найти все сообщения от mycoding
 
Регистрация: 06.01.2010
Сообщений: 1,022

Всё же лучше ajax выделить в отдельную функцию. Так как у вас сейчас очень сложно понять и отследить ошибку.
Хотелось вам очень помочь, но просто так сделано, что не понятно вообще какая задача,и что надо и в чём ошибка.
__________________
Не вижу смысла в своём прибывании на форуме.
Всех достал.
Работу здесь я не найду - хотя не однократно пытался.
Знаний подчерпнуть тоже не могу.

Меняю пароль и адрес электронной почты, чтобы больше никого не доставать.

Всем удачи.
Ответить с цитированием
  #5 (permalink)  
Старый 02.02.2010, 12:31
Кандидат Javascript-наук
Отправить личное сообщение для vk65535 Посмотреть профиль Найти все сообщения от vk65535
 
Регистрация: 21.11.2008
Сообщений: 114

Объекты XMLHttpRequest создаются разные, просто в замыкании обработчика onreadystatechange остается последний.
request_remove.onreadystatechange = (function(request_remove) {
	return function() {
		// если ответ есть обновляем содержимое в блоке результатов
		if (request_remove.readyState == 4) {
			var e = document.getElementById("script_results");
			e.innerHTML = request_remove.responseText + e.innerHTML;
			// соединяем старые результаты с новыми (формирование отчета "на лету")

			request_remove.onreadystatechange = alert; // устраняем memory leak
		};
	};
})(request_remove);

P.S. Рекомендую все это делать одним запросом.

Последний раз редактировалось vk65535, 02.02.2010 в 15:00.
Ответить с цитированием
  #6 (permalink)  
Старый 02.02.2010, 19:28
Аспирант
Отправить личное сообщение для Neokortex Посмотреть профиль Найти все сообщения от Neokortex
 
Регистрация: 29.01.2010
Сообщений: 39

vk65535,
спасибо. вы гений
Ответить с цитированием
  #7 (permalink)  
Старый 02.02.2010, 19:45
Аспирант
Отправить личное сообщение для Neokortex Посмотреть профиль Найти все сообщения от Neokortex
 
Регистрация: 29.01.2010
Сообщений: 39

А как это можно сделать одним запросом. Это так. На будущее. Направьте, пожалуйста
Ответить с цитированием
  #8 (permalink)  
Старый 02.02.2010, 20:37
Кандидат Javascript-наук
Отправить личное сообщение для vk65535 Посмотреть профиль Найти все сообщения от vk65535
 
Регистрация: 21.11.2008
Сообщений: 114

Как-то так, но возможны ошибки, не тестил:
function remove_categ(id_categ){
	// ОБРАБОТКА ЗАПРОСОВ К СКРИПТУ ПО ОДНОМУ
	// выводим надпись в блоке результатов
	document.getElementById('script_results').innerHTML = 'Переносим в ' + id_categ + ' следующие категории:<br />';
	// создаем XMLHttpRerquest запрос
	var request_remove;
	try { request_remove = new XMLHttpRequest(); } 
	catch (er) {
		try { request_remove = new ActiveXObject("MSXML2.XMLHTTP"); } 
		catch (er) {}
	}
	if (!request_remove) { alert("Error initializing XMLHttpRequest!"); return; }
	// обращение к php скрипту
	var url = "remove_category.php", params = [];
	// создаем цикл по всем чекбоксам
	for (var r = document.getElementsByName('remove_checkbox'), j = 0, l = r.length; j < l; j++) {
		// если чекбокс выделен выполняем следующее
		if (r[j].checked) params.push(['kuda[', escape(r[j].value), ']=', escape(id_categ)].join(''));
	}
	request_remove.open("POST", url, true);
	request_remove.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=utf-8');
	request_remove.onreadystatechange = function() { 
		// если ответ есть обновляем содержимое в блоке результатов
		if (request_remove.readyState !== 4) return;
		if (!(request_remove.status >= 200 && request_remove.status < 300)) alert('Error sending data.');
		else document.getElementById("script_results").innerHTML = request_remove.responseText;
		request_remove.onreadystatechange = alert; // устраняем memory leak
	};
	request_remove.send(params.join('&'));
};

в пхп прийдет массив kuda с ключами kakoi.

Последний раз редактировалось vk65535, 03.02.2010 в 17:01.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вывод таблички из mysql в ajax alexandre AJAX и COMET 40 18.08.2009 11:46
вывод getElementById проблема Russian Общие вопросы Javascript 4 07.08.2009 14:54
Проблема с AJAX запросом + mod_rewrite BrokenEye AJAX и COMET 1 12.07.2009 02:08
Проблема с Ajax запросом в IE и Opera flash_uz AJAX и COMET 0 30.04.2009 15:08
Проблема с обработкой селектов html кода, пришедшего через ajax запрос Rage jQuery 6 26.01.2009 14:15