Autor Zpráva
TomasJ
Profil
Zdravím. Mám problém s načítáním obsahu přes AJAX, když načítám obsah z nekonečných cyklů. Příklad:
Mám PHP skript, kde je nekonečný cyklus. V cyklu vypíšu nějaký text, uspím na půl sekundy skript, a pokračuji dále...
Pak mám JS, kterým otevřu PHP skript s nekonečným cyklem a do onReadyStateChange dám výpis obsahu do elementu <div>. Pokouším se o to, aby mi AJAX vypisoval vše co se v PHP skriptu vypíše. Jen toho nějak nemohu docílit u prohlížečů Opera a Chrome. Ve Firefoxu to funguje jak má. V IE to funguje v případě, že vedu vše ještě přes <iframe>. Tj. AJAX otevře stránku, kde je iframe a iframe má SRC na PHP skript. Pak ukázka částečné (ale nedostatečně) funguje i v Opeře, ale Chrome nic.

Ukázky:
Holý PHP skript
PHP skript načtený v iframe
AJAX bez iframe
AJAX s iframe

Děkuji všem za rady.
Pokud máte otevřenou některou z ukázek, a otevřete si další (tu samou nebo jinou), může se stát, že se vám v tom okně nebude nic psát, dokud nezavřete ostatní ukázky.
_es
Profil
TomasJ:
Asi je nekompatibilita prehliadačov ohľadom vyvolania udalosti onReadyStateChange či prístupu k neúplne načítanému obsahu - vlastnosti responseText. Pri práci s objektom XMLHttpRequest sa obvykle predpokladá, že sa pracuje až s úplne načítanými dátami, pri inom používaní nie je isté správanie sa v rôznych prehliadačoch.
Ak by to aj fungovalo vo všetkých prehliadačoch, tak to je chybný návrh z pohľadu dlhšej doby behu skriptu. V JS by sa pracovalo so stále dlhším textovým reťazcom a aj do toho HTML elementu by bol zapisovaný stále dlhší a dlhší text.
TomasJ
Profil
A měl bys nějakýjiný návrh, jak udělat online chat, s jedním vyvoláním PHP skriptu (aby vše běželo pouze na jednom portu) s protokolem UDP?
TomasJ
Profil
Tak jsem hledal, zatím mě napadl jen Flash. Jen ho neumím a v případě, že bych se chtěl začít učit Flash, tak na to ani nemám čas (za měsíc a něco zápočty a zkoušky). Když by se čas našel, absolutně nevím kde začít. Tak se ptám: Dá se toto vyřešit nějak elegantně i bez Flashe?
_es
Profil
TomasJ:
V niektorých prehliadačoch môže fungovať: www.zdrojak.cz/clanky/web-sockets

s protokolem UDP
Čo s tým má UDP?
TomasJ
Profil
_es:
No: Online chat na protokolu UDP. Musí to běžet s protokolem UDP, protože máme herní server, který má komunikaci s webem právě přes tento protokol. PHP skript obsahuje UDP klienta, který píše příchozí data přímo, v reálném čase. V podstatě mi vše funguje správně, jen se chci zbavit nekonečného načítání stránky.

WebSockets vypadá velmi zajímavě, a řešilo by to i můj problém.
Ale jak správně píšeš, v některých přohlížečích to fungovat může a v některých to prostě nefunguje. Já chci, aby chat fungoval správně od IE 7 (i když web mám optimalizovaný i pri IE 6).
Witiko
Profil
TomasJ:
Pokud to správně chápu, tak se snažíš o long polling?
TomasJ
Profil
Witiko:
Ano, přesně tak. Jen jsem nevěděl jak to nazvat.
Mohl bys mi prosím ukázat nějakou ukázku / příklad, kde to je použité?

Na zkoušku jsem vytvořil účet Tester s heslem djpw. Můžete se kouknout na http://samp.k3s4.sk, kde se přihlásíte. Pak pokračujte s tom spodním menu na položku Server Chat a uvidíte, jak se to neustále načítá. Na chatu lze být pouze 1x z tohoto účtu, takže se prosím nezlobte, když se vám ukáže tento text. Ono mně osobně to nevadí, ale pár lidí je pak zmateno, že se jim nechce stránka načíst.
Witiko
Profil
TomasJ:
Long polling používá například facebook chat. Trik je v tom, že data tahaná pomocí XHR se pošlou s HTTP hlavičkou Content-type: multipart/x-mixed-replace, přičemž prohlížeč díky této hlavičce spojení neukončí a stále čeká na nová data, která se odchytávají pomocí onReadyStateChange. Má to výhodu, že na rozdíl od normální HTTP žádosti tato nemá timeout a prohlížeč se netváří, jako by pořád něco stahoval. Pro zpětnou kompatibilitu s prohlížeči, které hlavičku nerozeznávají, se pak XHR obvykle abortuje při každých nových datech od serveru a vytváří se nové.
TomasJ
Profil
Witiko:
se pak XHR obvykle abortuje při každých nových datech od serveru a vytváří se nové
Tak to je zase špatné. Nemohu dopustit aby se vytvořilo nové spojení. Nové spojení odmítám, dokud je v platnosti to staré. Staré platí dokud se posílá oživovací packet. Pokud se do 10 sekund nepošle, spojení je označené za prošlé. Ale děkuji i tak.

Napadlo mě pro IE udělat alternativu - nechat iframe. Na wikipedii píší, že v ostatních to šlape.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: