Вывод буфера в AJAX запросе

Тема в разделе "Другие языки", создана пользователем HalliK, 11 фев 2009.

Статус темы:
Закрыта.
Модераторы: Цукер
  1. HalliK

    HalliK Постоялец

    Регистр.:
    4 фев 2007
    Сообщения:
    117
    Симпатии:
    166
    Приветствую всех! Возник один важный для меня момент в работе с аяксом, вот собственно оригинал скрипта - http://demos.mootools.net/Form.Send. При нажатии кнопки отправить появляется анимация, мол скрипт выполняется и после окончания работы скрипта анимация исчезает и грузится буфер. Так вот как организовать подобие flush() при выполнении аякс запроса? То есть я нажимаю кнопку, появляется анимация, выполняется код до первого flush() и это выводится в хтмл, анимация не исчезает и скрипт выполняется до конца. Я так понимаю это делается настороне клиента посредством запросов со стороны клиента на сервер каждые N миллисекунд, но так как в JS и mootools не силен, то надеюсь что вы мне поможете;)

    P.S. Вот еще интересный скрипт - http://davidwalsh.name/dw-content/image-preloader.php. Я думаю скрестить можно, но в нем та же самая проблема - 10 картинок загружаются, и потом все враз показываются, было бы классно если бы по мере загрузки картинок те появлялись бы в хтмл...

    В общем думаю я в нужном разделе и надеюсь на вашу помощь! Заранее спасибо!
     
  2. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Просто посылай запрос каждые N секунд и выводи результат.
     
  3. HalliK

    HalliK Постоялец

    Регистр.:
    4 фев 2007
    Сообщения:
    117
    Симпатии:
    166
    Код:
    window.addEvent('domready', function() {
    	// You can skip the following two lines of code. We need them to make sure demos
    	// are runnable on MooTools demos web page.
    	if (!window.demo_path) window.demo_path = '';
    	var demo_path = window.demo_path;
    	// --
    	$('myForm').addEvent('submit', function(e) {
    		//Prevents the default submit event from loading a new page.
    		e.stop();
    		//Empty the log and show the spinning indicator.
    		var log = $('log_res').empty().addClass('ajax-loading');
    		//Set the options of the form's Request handler. 
    		//("this" refers to the $('myForm') element).
    		this.set('send', {onComplete: function(response) { 
    			log.removeClass('ajax-loading');
    			log.set('html', response);
    		}});
    		//Send the form.
    		this.send();
    	});
    });
    вот сам js. По части JS абсолютный ноль, примерчик накатаешь?:thenks:
     
  4. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    975
    Симпатии:
    255
    Код:
    window.addEvent('domready', function() {
    	// You can skip the following two lines of code. We need them to make sure demos
    	// are runnable on MooTools demos web page.
    	if (!window.demo_path) window.demo_path = '';
    	var demo_path = window.demo_path;
    	// --
    	$('myForm').addEvent('submit', function(e) {
    //добавь сюда 
    [B]showContactTimer();[/B]
    
    		//Prevents the default submit event from loading a new page.
    		e.stop();
    		//Empty the log and show the spinning indicator.
    		var log = $('log_res').empty().addClass('ajax-loading');
    		//Set the options of the form's Request handler. 
    		//("this" refers to the $('myForm') element).
    		this.set('send', {onComplete: function(response) { 
    			log.removeClass('ajax-loading');
    			log.set('html', response);
    		}});
    		//Send the form.
    		this.send();
    // добавь сюда 
    [B]hideContactTimer();[/B]
    	});
    });
    
    [B]function showContactTimer () {
    	var loader = document.getElementById('loadBar');
    	loader.style.display = 'block';
    	var loader = document.getElementById('ans');
    	loader.style.display = 'block';	
    //раскомментируй если нужно убрать форму через некоторое время
     	//sentTimer = setTimeout("hideContactTimer()",3000);
    	}
    function hideContactTimer () {
    	var loader = document.getElementById('loadBar');
    	// Hide the load bar alas! Done Loading
    	loader.style.display = "none";[/B]
    	// Now Hijack the form elements
    
    
    в  html воткни вот такой код 
    [B]<div id="ans" style="display:none">		</div>
    <div id="loadBar" align="center" style="display:none">		
    <strong>Отправка данных...</strong>	<br />
    <img src="comments/img/loading.gif" alt="Загрузка..." title="Отправка данных" />
    </div>	
    <div>[/B]
    
     
    HalliK нравится это.
  5. HalliK

    HalliK Постоялец

    Регистр.:
    4 фев 2007
    Сообщения:
    117
    Симпатии:
    166
    Увы, не работает, после выполнения выдает сразу весь буфер, ане по частям как хотелось... Попробую приязать это
     
  6. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    975
    Симпатии:
    255
    Тот код, который я написал - выдает анимацию. Осталось разобраться куда точно нужно вставить show и hide функции. :)
     
  7. HalliK

    HalliK Постоялец

    Регистр.:
    4 фев 2007
    Сообщения:
    117
    Симпатии:
    166
    Вот я всяко пробую, ну никак не хочет отдаватькусками :( Можешь скачать ради интереса этот примерчик с офсайта мутулс. Там анимация есть, но попробуй воткнуть в пхп скрипт что то типа этого:
    Код:
    for ($i=1;$i<=3;$i++){echo $i.'<br />';flush();sleep(1);}
    То что есть, сразу выдаст 1 2 3 в столбик, вместо желаемых 1 вывели 2 вывели и 3 вывели...
     
  8. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Ты вроде как не совсем понимаешь: каждый AJAX-запрос - это запуск твоего скрипта по новой и ждать он будет пока твой скрипт не отработает до конца.

    Ты лучше обрисуй свю задачку полностью, тогда и решение найдётся.
     
  9. HalliK

    HalliK Постоялец

    Регистр.:
    4 фев 2007
    Сообщения:
    117
    Симпатии:
    166
    эту часть я понимаю :)
    Но ведь можно же во время выполнения скрипта отдавать буфер? Как то реализовано же аякс загрузка файла с прогресс баром например, там вроде как каждые N миллисекунд идет обращение к скрипту, тот отдает массив получаемый функцией uploadprogress_get_info, делаются вычисления по определенным значениям элементов массива... и рисуется прогресс бар, но смысл не в этом, мне то нужно чтобы аяксом появлялись в каком нибудь div'е сообщения выполняемого скрипта, а не все сразу.

    Живой пример как это можно использовать:
    Рега аккаунтов - указал в поле кол-во регистрируемых аккаунтов и передаешь аяксом значение поля num скрипту... В скрипте следующий код:
    PHP:
    for ($i 0$i $_POST['num'];$i++) {
        
    $login 'nulled';
        
    $password generate_password(6); //функция пассы генерит допустим
        // далее код автореги
        // если успешно зарегистрировано,то выдаем
        
    echo $login.':'.$password.'<br />';
        
    flush();
    }
    Мне нужно если я указал 3 акка, то чтоб показывался процесс, примерно знал где идет работа скрипта, а не чтоб все это в конце стопкой появлялось :)

    P.S. Не судите строго, просто хочу обворачивать свои срипты в красивые оболочки, неравнодушен к дизайну и веб 2.0. Спасибо всем заранее!
     
  10. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    975
    Симпатии:
    255
    Для того, чтобы отдавать текст кусками, тебе придется запускать скрипт несколько раз. Т.е. запустил 1 раз - получил кусок текста, отобразил на сайте и запустил снова этот же скрипт (или другой), получил данные, отобразил ...
    Вот по такой технологии работают AJAX.
     
    HalliK нравится это.
Статус темы:
Закрыта.