Этот способ, как ни странно, поддерживается только Firefox. На момент написания Opera и Safari под Windows не поддерживали его. Он представляет собой XHR-запрос, ответ на который может быть разделен на части. При получении новой части вызывается onload().
Вот - пример, можете попробовать его в любом браузере, и увидите, изменилось ли что-то в поддержке. Эталонное поведение: Firefox.
Тут будут сообщения
Вот - клиентский код
function runMultipart() {
// не кросс-браузерно, все равно способ Firefox only
var req = new XMLHttpRequest();
req.multipart = true;
// асинхронный запрос
req.open("GET","/server_push/multipart.php?r="+Math.random(), true);
req.onload = function(event) {
var result = event.target.responseText
var d = document.createElement("div")
d.innerHTML = "onload:"+result;
document.getElementById('xhr_multipart_dump1').appendChild(d)
}
req.onreadystatechange = function() {
if (req.readyState!=4) return
var d = document.createElement("div")
d.innerHTML = "State:"+req.readyState+' Status:'+req.status
document.getElementById('xhr_multipart_dump1').appendChild(d)
}
req.send(null);
}
Асинхронность запроса в случае с Multipart XMLHTTPRequest - вещь довольно условная, при установке синхронности - реально браузер подвиснет только до
первой части multipart-сообщения. Думается, это самое правильное, что можно было сделать, т.к получать весь multipart-запрос синхронно никому не нужно, для этого
есть обычные запросы.
Для обработки данных, как видно из примера, в Multipart XMLHTTPRequest используется функция onload, которая получает последний кусок из event.
Есть аналогичная функция onerror, но при вызове из javascript она не работает. Поэтому для обработки ошибок используем старый добрый onreadystatechange, который
вызывается при каждом куске данных или при ошибке.
Чтобы ответить на Multipart XMLHTTPRequest, сервер должен выбрать уникальный разделитель, и первым делом - сообщить его браузеру вместе со спец. заголовком:
Далее сервер может слать данные, и информировать браузер о конце каждой части ответа посылкой разделителя. Перед каждой частью ответа должен быть заголовок Content-Type.
Более подробно - вот, например, серверный код из примера выше.
// уникальный разделитель, можете использовать конкат нескльких uniqid() и т.п.
$delimiter = "boundary";
header('Content-type: multipart/x-mixed-replace;boundary="'.$delimiter.'"');
// полностью отрубаем буферизацию
while (@ob_end_flush()) {}
$header = "Content-type: text/html\r\n\r\n"; // перед каждой частью
$boundary = "--{$delimiter}\n"; // между частями
$footer = "--{$delimiter}--\n"; // в конце
$max = 10;
for ($i = 1; $i <= $max; $i++){
echo $header; # Заголовок перед каждой частью ответа
echo "$i\n"; # пишем сообщение
echo $boundary; # и выводим границу между сообщениями
sleep(1);
}
// завершающее сообщение
echo $header;
echo "-1";
echo $footer;
минимальная задержка и трафик
нет индикации загрузки
данные нельзя сжимать
Firefox(Gecko) only (?)
Замечательный способ, но работает только в движке Gecko, т.е Firefox и родственные браузеры.
multipart/x-mixed-replace, на мой взгляд, единственно правильная comet-технология.
Приведу 3 аргумента:
1) всё давным давно описано в RFC.
2) куски можно передавать любого тип, размера и кодирования и, причём, вперемешку.
3) Content-Length избавляет от тупого ресурсоёмкого постоянного grep-а.
По моим наблюдениями, Опера и Хром начинают поддерживать multipart/x-mixed-replace, однако пока через пень-колоду.
Например, Опере пофиг Content-Length очередного куска,
она будет ждать boundary след. блока прежде чем начать обработку.
Всё было бы хорошо, но "браузер для овощей" упорно не хочет поддерживать x-mixed-replace.
Всё бы хорошо с этим методом, но есть одна проблема, которую мне не удалось решить (по видимому это баг в фаерфоксе), которая снижает до нуля всю ценность метода. Суть в том, что после прихода первого пакета с данными, перестают работать обработчики ошибок соединения; они просто ни на что не реагируют, ни error, ни abort, ни onreadystatechange. Можно соединение порвать любым способом, но никаких событий в JS это не сгенерирует и таким образом реализовать логику обработки ошибок невозможно. А без обработки ошибок, возможности вовремя и быстро перепослать запрос, ценности в методе нет никакой...
Making the best decisions for your life is a challenge in the interesting life simulator BitLife. Are you prepared to face all the obstacles the world has to offer, including a complicated life filled with difficult choices, and many ups, and downs? Then try to lead your character on a lovely journey in this fantastic free online game. Relationships and a variety of activities based on your age, wealth, and employment can either make for a lovely life or a terrible hell on Earth.
I accidentally searched and visited your site. I still saw several posts during my visit, but the text was neat and readable. I will quote this post and post it on my blog. Would you like to visit my blog later? 온라인카지노사이트
What a post I've been looking for! I'm very happy to finally read this post. 토토사이트 Thank you very much. Can I refer to your post on my website? Your post touched me a lot and helped me a lot. If you have any questions, please visit my site and read what kind of posts I am posting. I am sure it will be interesting.
Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены. Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
да уж, и зачем тогда это нужно если только Лиса поддерживает?
Ну варианта 2
1) пишется приложение только под "Лису"
2) этот способ используется для лисы а для других браузеров - другой
Chrome работает с ним
Мой тест работает только в Firefox... Может быть, у Chrome свое API ?
чел наверно не понял какой должен быть результат, результат то конечно есть, но не тот, что ожидается
Chrome поддерживает.
Только немного по-другому. Нужен еще один обработчик:
Чтобы что-то увидеть в event.target.responseText, приходится послать клиенту не меньше килобайта с 4мя переводами строки.
и еще надо добавить flush(); после каждой посылки.
multipart/x-mixed-replace, на мой взгляд, единственно правильная comet-технология.
Приведу 3 аргумента:
1) всё давным давно описано в RFC.
2) куски можно передавать любого тип, размера и кодирования и, причём, вперемешку.
3) Content-Length избавляет от тупого ресурсоёмкого постоянного grep-а.
По моим наблюдениями, Опера и Хром начинают поддерживать multipart/x-mixed-replace, однако пока через пень-колоду.
Например, Опере пофиг Content-Length очередного куска,
она будет ждать boundary след. блока прежде чем начать обработку.
Всё было бы хорошо, но "браузер для овощей" упорно не хочет поддерживать x-mixed-replace.
Всё бы хорошо с этим методом, но есть одна проблема, которую мне не удалось решить (по видимому это баг в фаерфоксе), которая снижает до нуля всю ценность метода. Суть в том, что после прихода первого пакета с данными, перестают работать обработчики ошибок соединения; они просто ни на что не реагируют, ни error, ни abort, ни onreadystatechange. Можно соединение порвать любым способом, но никаких событий в JS это не сгенерирует и таким образом реализовать логику обработки ошибок невозможно. А без обработки ошибок, возможности вовремя и быстро перепослать запрос, ценности в методе нет никакой...
Альтернативой является эмуляция EventSource, причём не абы какая (тыщи их), а построенная на POST / readyState==3, как https://github.com/Yaffle/polyfills/blob/master/eventsource.js. Там по ловятся те ошибки, которые проскакивают в этом методе.
It's a great piece of information, when I search for it, I don't know how to use it scribble io
Tool to help sort messy letters into words quickly
word unscrambler Tool to help sort messy letters into words quickly
Making the best decisions for your life is a challenge in the interesting life simulator BitLife. Are you prepared to face all the obstacles the world has to offer, including a complicated life filled with difficult choices, and many ups, and downs? Then try to lead your character on a lovely journey in this fantastic free online game. Relationships and a variety of activities based on your age, wealth, and employment can either make for a lovely life or a terrible hell on Earth.
I accidentally searched and visited your site. I still saw several posts during my visit, but the text was neat and readable. I will quote this post and post it on my blog. Would you like to visit my blog later? 온라인카지노사이트
What a post I've been looking for! I'm very happy to finally read this post. 토토사이트 Thank you very much. Can I refer to your post on my website? Your post touched me a lot and helped me a lot. If you have any questions, please visit my site and read what kind of posts I am posting. I am sure it will be interesting.
I still saw several posts during my visit, but the text was neat and readable. I will quote this post and post it on my blog. geometry dash
Отправить комментарий
Приветствуются комментарии:Для остальных вопросов и обсуждений есть форум.