Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ajax + jquery + php, моментальный вывод работы через ajax 
:(
    Опции темы
supercelt
Дата 7.2.2013, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 25.8.2005

Репутация: 1
Всего: 1



Здравтсвуйте!
Помогите пожалуйста. Есть вот такой рабочий пример:
Имеем форму файл index.php
Код

<script language="javascript" src="http://code.jquery.com/jquery-latest.js"></script>
<script language="javascript" src="custom.js"></script>
.......
<form name="1" method="post">
<input type="button" name="search" id="search" value="search" onSubmit="false;" />
<input type="button" name="clear" id="clear" value="clear" />
</form>
<br />
<div id="result"></div>


Файл custom.js
Код

$.noConflict();
jQuery(document).ready(function($){
    $('#search').click(function(){
        $.ajax({
            type: "POST",
            dataType: "json",
            url: "execute.php",
            data: {string: string}, //то что тут передаём это не в расчёт. Просто пример
            success: function(html){
                $('#result').empty();
                $('#result').append(html.s1).append('<>').append(html.s2);
            }
        });
    });
    $('#clear').click(function(){
        $('#result').empty();
    });
});


И собсно файл обработчик execute.php
Код

<?php
echo '{"s1":"1234567890", "s2":"437657545"}';
?>


Смысл в том, что когда нажимаем на кнопку поиск, то в слое result появляется 1234567890<>437657545. Всё верно. Задача в том, что обработчик может что-то выводить в цикле и надо отображать каждую итерацию не ожидая завершения работы php скрипта. 

Есть работающий пример для вывода после каждой итерации:
Код

<?PHP
while (ob_end_clean()){}; // на всякий случай
ob_implicit_flush(1);
echo str_repeat(chr(0), 4096); // IE
$n = 5;
while ($n > 0) {
echo '{"s1":"1234567890", "s2":"437657545-'.$n.'-"}';
sleep(1);
$n--;
}
?>


Работает, скрипт выведет с интервалом 1 сек каждую итерацию. Но если вызывать этот скрипт напрямую 1111111111/execute.php вот так.
А через аякс не работает. Вот как в аякс вкрутить этот цыкл вывода?



Это сообщение отредактировал(а) supercelt - 7.2.2013, 23:14
PM   Вверх
Arantir
Дата 8.2.2013, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 14
Всего: 55



Дело в том, что как бы не рассчитано на то, что через php вы что-то выводите "каждую секунду".
Как оно выводится - зависит от браузер и сервера. Постепенный вывод - это просто иллюзия. Сервер отправляет данные, отправляет, отправляет, пока все не отправит. Браузер в идеале ожидает окончания получения всех данных. Но если это затягивается, то часть уже полученного может быть показана заранее, чтобы пользователь не скучал... По-этому иногда можно мельком увидеть страницу в не самом лучшем виде (когда еще onLoad-скрипты не выполнились и всякие скриптовые вкладки/спойлеры наперекосяк получаются). И этот таймаут между показом кусков полученных данных у браузеров разный.
Почему это невозможно? Все очень просто - в самом принципе работы современных браузеров. Сейчас запрос может быть инициирован только пользователем. Сервер запросы отправлять не может, только ответ на запрос. А чтобы отправлять данные с задержкой, то сервер должен сам инициировать их отправку каждый интервал времени (ведь браузер не в курсе, когда получать следующую порцию), а такое просто не предусмотрено.

Ajax для вызова ивента complete ожидает окончания загрузки, соответственно с подобной задержкой в скрипте он сначала подождет все N итераций, а уже потом будет вызван ивент.

В вебе все делается не так. Каждый отдельный запрос должен исходить со стороны пользователя. Это значит, что надо не через php каждую секунду выводить, а через JavaScript каждую секунду посылать запрос.
Сохранить текущую итерацию можно в сессии, для чего они и были придуманы - хранить данные между запросами. А можно и через GET в ссылке передавать, а итерации в JS-скрипте хранить.


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
skyboy
Дата 8.2.2013, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



Цитата(Arantir @  7.2.2013,  23:37 Найти цитируемый пост)
 а такое просто не предусмотрено.

comet ведь!
PM MAIL   Вверх
Arantir
Дата 8.2.2013, 02:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 14
Всего: 55



skyboy, в контексте читать надо, а не вырывать фразы. Или я ниже про JS не написал?

Вот вам цитата с той же википедии:
Цитата

Теоретически модель Comet отличается от изначальной концепции всемирной паутины, при которой для обновления страницы браузер запрашивает её полностью или частично. Однако на практике приложения Comet обычно используют Ajax c long polling для проверки наличия новой информации на сервере.
Цитата

Поскольку браузеры и веб-серверы работают по протоколу HTTP, который на подобные соединения не рассчитан, разработчики используют различные реализации.


Именно о чем я и говорил...


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
skyboy
Дата 8.2.2013, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 10
Всего: 260



Цитата(Arantir @  8.2.2013,  01:45 Найти цитируемый пост)
Или я ниже про JS не написал?

извини.
прочитал про 
Цитата(Arantir @  7.2.2013,  23:37 Найти цитируемый пост)
 а через JavaScript каждую секунду посылать запрос.

показалось, что на long polling похоже не слишком. добавил инфы.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0598 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.