реализация long pull / кометы в простом javascript без фреймворков, требующих XSS - PullRequest
1 голос
/ 12 апреля 2011

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

Кажется, что Google придумала много солнц, используяразличные платформы, такие как JQuery и т. д., чтобы сделать это на стороне клиента.Однако это не вариант для меня.

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

1 Ответ

1 голос
/ 12 апреля 2011

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
...