реализация long pull / comet в простом javascript фреймворки не требуют XSS

#javascript #jquery #comet #long-polling

#javascript #jquery #comet #длительный опрос

Вопрос:

У меня есть свой собственный урезанный скрипт, который в настоящее время использует теги XHR или script в зависимости от поддержки браузера. Эти запросы в конечном итоге возвращают некоторый JSON. Моя проблема в том, что теперь элементы этого объекта теперь должны обновляться сервером во время работы на клиенте, т. Е. мне нужно реализовать что-то вроде long pull / comet soln.

Google, похоже, придумал множество soln, использующих различные фреймворки, такие как jQuery и т.д., Чтобы сделать это на стороне клиента. Однако это не вариант для меня.

Мне было интересно, есть ли у вас, ребята, какие-либо предложения о том, как я мог бы расширить свой существующий подход, чтобы разрешить обновления стиля comet с сервера. Один из стандартных подходов, похоже, использует скрытые фреймы iframes. Это бесполезно, поскольку сервер приложений, который предоставляет мне мои данные json, отличается от реального веб-сервера.

Ответ №1:

jQuery просто обтекает объект XHR / XMLHttpRequest. Прежде всего, вам нужна небольшая функция для возврата объекта кроссбраузерным способом. Это делается в 3 строки или меньше, не слишком сложно. Тем не менее, это отличные фрагменты для исправления различных проблем браузера, таких как утечки памяти. Я настоятельно рекомендую вам использовать этот. Они, конечно, занимают более 3 строк (если не уменьшены). Но в любом случае, если вам нужны повторные подключения, вы просто не сможете сделать это с нуля.

Далее, на стороне сервера, предполагая, что вы используете PHP:

 set_time_limit(300); // force connection only after 5 minutes
ignore_user_abort(false); // if the connection ends, terminate immediately

while(true){
    if(some_condition()){
        echo some_response();
        break; // break the loop
    }
    sleep(2); // wait for a second or two
}
  

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

Пример на стороне клиента:

 function poll(){
    jQuery.get('http://somesite.com/poll.php',function(data){
        alert('Just received: ' data);
        poll(); // repeat poll
    });
}
poll(); // begin polling
  

Комментарии:

1. Кристиан, можешь немного рассказать о том, как я бы реализовал то, что ты говоришь, на стороне клиента.

2. Смотрите мой пересмотренный код. Хотя в jQuery должно быть легко преобразовать в обычный javascript.