PHP / JS Ajax - отображение страницы PHP в цикле по массиву - PullRequest
2 голосов
/ 23 марта 2011

У меня есть страница videos.php, которая загружает видео через Ajax.На странице php ajax, video_feed_ajax.php, он просматривает массив, создающий объект для каждого видео.Тем не менее, текущий способ, которым я написал JS, отображает video_feed_ajax.php только тогда, когда он полностью загружен (когда он проходит по всему массиву).-> Есть ли способ отображать video_feed_ajax.php каждый раз, когда он проходит цикл, поэтому видео показывается по мере его прохождения, а не только в конце?

Части моего JS, которые применяются:

xmlhttp.onreadystatechange=stateChangedUsersAddVideoFeed;
xmlhttp.open("GET",url,true);
xmlhttp.send(null);

function stateChangedUsersAddVideoFeed()
{
    document.getElementById("add_video_feed").innerHTML=xmlhttp.responseText;
    document.getElementById('add_video_feed_load_img').style.display='none'; 
}

Ответы [ 3 ]

1 голос
/ 24 марта 2011

Вы можете вызвать функцию flush внутри цикла в PHP для немедленной отправки эхом разметки.

Но если ваш цикл занимает достаточно много времени, чтобы создавать неудобства, то должно быть с ним не так - если только вы не хотите визуальный эффект прогрессивной загрузки, в этом случае вы должны просто оживить это после получения весь ответ. Нет смысла транслировать только несколько килобайт.

1 голос
/ 24 марта 2011

Я пошел с комбинацией обоих ваших ответов.Я добавил flush () в конец цикла PHP и изменил свой код JS следующим образом.Это может быть не на 100% надежно, но это лучшее решение, которое у меня есть.Спасибо, ребята!

if (xmlhttp.readyState==3)
{
    document.getElementById("add_video_feed").innerHTML=xmlhttp.responseText;
}
if (xmlhttp.readyState==4)
{
    document.getElementById('add_video_feed_load_img').style.display='none';
}
1 голос
/ 23 марта 2011

Есть ли способ отображать video_feed_ajax.php каждый раз, когда он проходит цикл, поэтому видео показывается по мере его прохождения, а не только в конце?

Я собираюсь интерпретировать это так:

Есть ли способ обработать данные из запроса, когда они возвращаются с сервера, вместо того, чтобы обрабатывать весь документ сразу?

На что ответ «скорее всего, нет» в данном конкретном случае.

Вы пишете здесь ajax на голом металле и слепо предполагаете, что любые изменения readyState будут в вашу пользу. (Кстати, это плохая практика. Рассматривали ли вы использование современной библиотеки Javascript, такой как jQuery?)

Проблема в том, что это за состояния готовности и когда они запускаются. Состояния:

0: Неотправлено: объект существует.
1: Открыто: объект находится в процессе выполнения HTTP-запроса.
2: полученные заголовки: запрос выполнен и HTTP-заголовки возвращены.
3: Загрузка: тело HTTP-запроса передается и обрабатывается.
4: Готово: тело HTTP-запроса полностью загружено.

Различные браузеры по-разному обрабатывают 0, 1 и 2, поэтому давайте представим, что они не существуют.

Теперь в спецификации сказано, что ответ должен быть частично заполненным, поскольку он становится доступным , но ваш код срабатывает только при изменении состояния. Вы только когда-нибудь увидите два изменения состояния: загружается или готово. Это означает, что ваш существующий код никогда не увидит частичный документ!

Теперь, мой инстинкт инстинкта в том, что вы можете установить setTimeout, когда readyState загружается, а затем постоянно опрашивать ответ, чтобы увидеть, что изменилось, но это вряд ли сработает. Как описано в этом предыдущем вопросе здесь, на SO , , некоторые браузеры не реализуют загрузку readyState! Это означает, что ваш код может только надежно видеть Done readyState.

Таким образом, вы не можете сделать это ... без посторонней помощи.

В HTML5 предлагается новая технология под названием Серверные события . Он предназначен для того, чтобы делать именно то, что вы пытаетесь сделать здесь: отправлять отдельные фрагменты данных, по одному, вплотную и обрабатывать их независимо. Существуют собственные реализации в Chrome и Opera, и есть плагин jQuery для эмуляции интерфейса , когда браузер не реализует его. Они хотели вставить его в Firefox 4, но не смогли сделать это. Я только знаю, что эта технология существует, а не то, что она работает или подходит для ваших целей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...