Autor Zpráva
blazej44800
Profil
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
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";
Ten script v sekundových intervalech kontroluje databázi. Pokud najde něco zajímavého, vypíše to a ukončí se. Pokud do 30ti sekund nenajde nic zajímavého, ukončí se.
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
aha, ok super vďaka :)
blazej44800
Profil
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
Taky můžeš odchytávat onkey*** na textarea a pak porovnávat s časem předchozí události.
blazej44800
Profil
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
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;
}
+ textarea s onkeydown="write();"

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
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
Reaguji na blazeje44800:
Moc tomu tvému kódu nerozumím. Proč přepisuješ funkci write hodnotami true či false?
blazej44800
Profil
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
Chamurappi:
Blbě si pojmenoval proměnnou. Má proměnnou pojmenovanou stejně jako funkci.
blazej44800
Profil
Keeehi:
aha, jasne ani som si to nevšimol

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: