De situatie: Ik wil de browser UI vanuit de server live updaten. Hier wil ik events naar browser streamen. Ik wil daarvoor gebruik maken van de interactive mode (readyState==3) van het XMLhttp object. Volgens de theorie zou iedere keer als er nieuwe data is, een event moeten plaatsvinden met readyState op 3, zodat je de alvast binnengekomen responsetekst kunt gebruiken.
In Firefox werkt dit perfect: iedere keer als ik op de server een flush geef, komt er netjes een event bij de browser binnen en kan ik de nieuwe data uitlezen. IE en Opera denken daar echter heel anders over:
- Opera: roept readyState==3 een keer aan, daarna komen er geen events meer
- IE: roept readyState==3 een keer aan, en als je dan de response tekst wil lezen krijg je een error: The data necessary to complete this operation is not yet available daarna komen er geen events meer binnen.
Code van het event:
De vraag is nu: waar vind ik een voorbeeld van iets dergelijks dat wel crossbrowser werkt? Helaas staat er ook ook nergens duidelijk beschreven wat die interactive state nu precies zou moeten doen, of hoe deze gebruikt zou moeten worden. Ik heb al vanalles afgezocht, maar nog niets zinnigs kunnen vinden
Het zou toch echt zonde zijn als ik nu weer moest gaan pollen op events...
In Firefox werkt dit perfect: iedere keer als ik op de server een flush geef, komt er netjes een event bij de browser binnen en kan ik de nieuwe data uitlezen. IE en Opera denken daar echter heel anders over:
- Opera: roept readyState==3 een keer aan, daarna komen er geen events meer
- IE: roept readyState==3 een keer aan, en als je dan de response tekst wil lezen krijg je een error: The data necessary to complete this operation is not yet available daarna komen er geen events meer binnen.
Code van het event:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| var index = 0; function onlinereponse(){ alert(xmlhttp.readyState); if (xmlhttp.readyState==3) { var wholecommand = xmlhttp.responseText; var newtext = wholecommand.substring(index,wholecommand.length); index = wholecommand.length; if(newtext.length>0){ alert(newtext); eval(newtext); } } else if (xmlhttp.readyState==4) { alert("stream ended"); } } |
De vraag is nu: waar vind ik een voorbeeld van iets dergelijks dat wel crossbrowser werkt? Helaas staat er ook ook nergens duidelijk beschreven wat die interactive state nu precies zou moeten doen, of hoe deze gebruikt zou moeten worden. Ik heb al vanalles afgezocht, maar nog niets zinnigs kunnen vinden
Do diamonds shine on the dark side of the moon :?