Autor | Zpráva | ||
---|---|---|---|
blazej44800 Profil |
#1 · Zasláno: 7. 6. 2012, 17:00:13
Ahojte
Rozmýšlam už dlho nad tým, ako sa robí v chate to čo má napr. facebook: Username píše ... Rozmýšlal som že budem neustále dávať Jquery requesty na server ale zdá sa mi to byť príliž záťaž na server, tak ale ako potom sa to naozaj robí, aby sa tak rýchlo dokázalo zistiť že niekto píše správu? Zo strany písateľa by som to vedel vyriešiť (po nakliknutí na textové pole a po začatí písania sa pošle request na server) ale zo strany príjimaťeľa to už vyriešiť neviem. Vďaka za každy nápad :) |
||
Keeehi Profil |
#2 · Zasláno: 7. 6. 2012, 21:17:54
blazej44800:
Použiješ long polling. Vyšleš požadavek na server, ale ten odpoví až teprva když má čím odpovědět. tzn něco takového: <?php for($i=0;$i<30;$i++) { if(kontrola v db, zda protějšek píše) { echo "Username píše"; exit; } else { sleep(1); } } echo "Nikdo nepíše"; Jakmile přijde JS odpověď vysíláš nový požadavek. Mezi tím v odpovědi kontroluješ, zda je odpověď Username píše nebo Nikdo nepíše a podle toho se zachováš. |
||
blazej44800 Profil |
#3 · Zasláno: 8. 6. 2012, 16:35:40
aha, ok super vďaka :)
|
||
Časová prodleva: 4 dny
|
|||
blazej44800 Profil |
#4 · Zasláno: 12. 6. 2012, 14:49:00
Ešte by som potreboval jednu radu. Chystam sa spravit tú funkciu - niekto píše správu. Neviem ale ako zistiť, či niekto zadáva text do textarea. Rozmýšlal som, ukladať si každé 2 sekundy obsah textarei a potom ju porovnať s predchádzajúcov (pred 2 sekundami) a ak sa nebude zhodovať znamená to, že užívateľ píše. Ale určite na to existuje nejaký iný spôsob.
Vďaka |
||
Keeehi Profil |
#5 · Zasláno: 12. 6. 2012, 15:02:50
Taky můžeš odchytávat onkey*** na textarea a pak porovnávat s časem předchozí události.
|
||
blazej44800 Profil |
#6 · Zasláno: 12. 6. 2012, 15:46:41
var cakaj; var stlacene; function write() { if (!cakaj) { cakaj = true; setTimeout("casovac()",5000); } else { stlacene = true; } } function casovac() { if (stlacene) { alert("Pise sa..."); cakaj = false; stlacene = false; } else { cakaj = false; stlacene = false; } } Skúsil som niečo takéto, myslíte že tam nie je nejaký zádrh? V textarei je onkeydown="write();" |
||
Keeehi Profil |
#7 · Zasláno: 12. 6. 2012, 16:39:28
Já měl na mysli něco takového:
var cas = new Date(); var poslednizmacknuti = cas.getTime() - 5000; function write() { poslednizmacknuti = cas.getTime(); } function pisese() { if (cas.getTime() - poslednizmacknuti < 5000) return true; else return false; } Když kdykoliv zavoláte funkci pisese(), vrátí vám true/false podle toho, zda se zrovna píše nebo ne. Pokud chcete například každé 2 vteřiny kontrolovat zda se píše a tuto informaci odesílat na server můžete použít něco takového: setTimeout( function () { if(pisese()) // požadavek na adresu http://example.com/chat.php?uzivatel=xyz&pise=1 else // požadavek na adresu http://example.com/chat.php?uzivatel=xyz&pise=0 }, 2000 ); |
||
blazej44800 Profil |
Vdaka za radu, ale po otestovani to nefunguje. Užívateľ sa označí ako písajúci ale už keď prestane písať tak to nefunguje.
Skusil som ja postavit nieco nove, toto mi celkom funguje: var timeout; var write; function write() { if (!write) { write = true; $.get("index.php", { ajax: "1", action: "typechatwriter", value: "1" }); } else {clearTimeout(timeout);} timeout = setTimeout("cancel()",1500); } function cancel() { $.get("index.php", { ajax: "1", action: "typechatwriter", value: "0" }); write = false; } |
||
Keeehi Profil |
#9 · Zasláno: 12. 6. 2012, 17:41:51
blazej44800:
Fungovat by to mělo, akorát na rozdíl od [#8] je jako píšící označen člověk ještě 5s po skončení a ne 1,5s. Pokud ale ani po několika sekundách se požadavek nedostal na server, řekl bych že zafungovala chache. Jinak cache ti může dělat nepořádek i v tvém kódu. |
||
blazej44800 Profil |
Áno je to pravda, práve som písal do podpory hostingu. Lebo mne na stránke stále vysí jeden request ten long polling a potom sa do toho zamotávajú requesty či užívateľ píše správu. A ešte ne hostingu je v prevádzke normálne stránka takže sa dosť často stane, že server jednoducho spracuje ten request o písaní až po 30 sekundách keď skončí long polling bez odpovede. :) Ale aj tak vďaka
|
||
Chamurappi Profil |
#11 · Zasláno: 12. 6. 2012, 17:54:24
Reaguji na blazeje44800:
Moc tomu tvému kódu nerozumím. Proč přepisuješ funkci write hodnotami true či false ?
|
||
blazej44800 Profil |
#12 · Zasláno: 12. 6. 2012, 17:58:35
tam ukladám či sa píše alebo nie. Stále keď sa začne písať definuje sa write = 1 a spustí sa Timeout ktorý o 1,5s nastavý write = 0 (a zároven posle request na server). A v prípade že sa stlačí nejaké tlačidlo počas behu Timeoutu tak sa timeout zruší a zapne sa znova. Tá podmienka if skontroluje či treba serveru ohlásiť že sa píśe alebo nie. V kóde tuna [#7] je postavený tak, že každých 5 sekund posle serveru request či sa píše alebo nie. Môj ho iba pošle ak sa začalo alebo skončilo.
|
||
Keeehi Profil |
#13 · Zasláno: 12. 6. 2012, 17:58:45
Chamurappi:
Blbě si pojmenoval proměnnou. Má proměnnou pojmenovanou stejně jako funkci. |
||
blazej44800 Profil |
#14 · Zasláno: 12. 6. 2012, 17:59:30
Keeehi:
aha, jasne ani som si to nevšimol |
||
Časová prodleva: 11 let
|
0