Autor Zpráva
rudla
Profil
Ahoj, mám dotaz,
čím by se dalo docílit toho, aby se v ajaxovém chatu (je-li vypisovaný zdroj odlišný - tzn. obsahuje něco nového) zobrazilo nějaké upozornění. Napříkad aby se přehrál zvuk nebo vyvýšilo okno prohlížeče.
Na google jsem nic podobného za boha nenašel, tak se obracím na vás.
Je nějaká taková možnost, jak to udělat?
Děkuju moc za nápady a rady.
rudla
Profil
Opravdu nikdo neví?
Kcko
Profil
rudla:
http://stackoverflow.com/questions/450033/playing-sound-notifications-using-javascript
rudla
Profil
Kcko:
Děkuju, to je sice dobré, ale mně jde o to, jak udělat podmínku, podle které to zareaguje.
Keeehi
Profil
rudla:
Jakou podmínku? Přece se to spustí po tom, co se updatuje text v chatu. Pokud s tím máš nějaký konkrétní problém, musíš nám ukázat konkrétní kód. Nejlépe formou živé ukázky.
rudla
Profil
Keeehi:
Kdybych to dal po každém refreshi, bude to pípat pořád dokola. Mám tam funkci, která vypisuje text ze souboru (bez db).
Script jsem upravil z návodu citron.blueboard.cz/clanek-239-ajax-navod-pro-zacatecniky.html.

function aktualizuj()
{
     var url = "ADRESA";

     if (url != 0)
     {
        if (window.ActiveXObject)
        {
          httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
        }
        else
        {
          httpRequest = new XMLHttpRequest();
        }
        httpRequest.open("GET", url, true);
        httpRequest.onreadystatechange= function () {processRequest(); } ;
        httpRequest.send(null);
      }
      else
      {

        document.getElementById("chatlist").innerHTML = "";
        
      }
}

function processRequest()
{
  if (httpRequest.readyState == 4)
  {
    if(httpRequest.status == 200)
    {
      var mistoZobrazeni = document.getElementById("chatlist");
      mistoZobrazeni.innerHTML = httpRequest.responseText;
    }
    else
    {
//pokud nebyl nenalezen soubor...
    }
  }
}

window.setInterval("aktualizuj()", 800);
Keeehi
Profil
if ( mistoZobrazeni.innerHTML != httpRequest.responseText ) {
    mistoZobrazeni.innerHTML = httpRequest.responseText;
    //a pípej
}
rudla
Profil
Keeehi:
Dobře, ale do které části kódu to mám dát?
Když jsem to dal mimo to až na konec scriptu, nic z toho, co to vypisovalo to nevypisuje.

EDIT: zkusil jsem to dát místo tototo

    mistoZobrazeni.innerHTML = httpRequest.responseText;


if ( mistoZobrazeni.innerHTML != httpRequest.responseText ) {
    mistoZobrazeni.innerHTML = httpRequest.responseText;
    //a pípej
}
else{
    mistoZobrazeni.innerHTML = httpRequest.responseText;
}

ale nic
Keeehi
Profil
rudla:
Ano, co píšete po editaci, to je správně. Jen ta else větev je zbytečná. Else větev proběhne v případě, pokud jsou ty texty stejné, tak proč nahrazovat stejný text stejným.

Doufám, že víte že místo //a pípej máte dosadit kód, který spouští pípání. Tohle je jen komentář, který říká, kam to máte vložit.
rudla
Profil
To asi správně nebude. Při načtení stránky se v adrese zobrazí http://wyciwyg://23/...puvodni-adresa... a v momentě se přesměruje na původní adresu, ale ta se nenačte.
Chamurappi
Profil
Reaguji na Keeehiho:
Tvá podmínka nebude fungovat, protože při zápisu do innerHTML se převádí HTML na DOM a část informací se ztratí (malá/velká písmena u elementů a atributů, druh uvozovek, pořadí atributů, bílé znaky). Zpětný převod při čtení z innerHTML z DOMu na HTML skoro určitě nevrátí totéž, co bylo do innerHTML nastaveno.
rudla
Profil
Chamurappi:
Takže jak je to správně?
Keeehi
Profil
Dá se to udělat úplně stejně, jen s pomocnou proměnnou.
var old="";
function processRequest()
{
  if (httpRequest.readyState == 4)
  {
    if(httpRequest.status == 200)
    {
      var mistoZobrazeni = document.getElementById("chatlist");
      if(old != httpRequest.responseText) {
        old  = httpRequest.responseText;
        mistoZobrazeni.innerHTML = old;
      }
    }
    else
    {
//pokud nebyl nenalezen soubor...
    }
  }
}

rudla:
To asi správně nebude. Při načtení stránky se v adrese zobrazí http://wyciwyg://23/...puvodni-adresa... a v momentě se přesměruje na původní adresu, ale ta se nenačte.
S tímto by neměl mít tebou uvedený kód co do činění. Problém hledej jinde.
rudla
Profil
Keeehi:
Pokud to chápu správně, tohle je kód celé funkce na vypsání zdroje?
Pokud ano, 1) zdroj se nevypíše, 2) kam mám doplnit tu notifikaci?
rudla
Profil
Podle všeho to asi nebude správně, když mám dojem, že je to celé. Script nefunguje.
Keeehi
Profil
rudla:
Tak to to máš asi rozbité.
rudla
Profil
Keeehi:
Chceš říct, že když vložím ten kód, který jsi sám napsal, doplním hodnotu tak, aby to fungovalo a ono to nefunguje, tak to mám rozbité? Ale jak to tak může být? + Kam v tom mám vložit to "pípátko"?
Keeehi
Profil
Dodej odkaz na živou ukázku.
rudla
Profil
Keeehi:
http://zatnaktel.unas.cz/conversations/data/zivaukazka-ajaxchat.html
Keeehi
Profil
rudla:
A trochu nad tím popřemýšlet? Upravil jsem jednu z těch funkcí, co jsi dal do [#6]. To však neznamená, že máš tu druhou smazat.
rudla
Profil
Keeehi:
Skvěle, takže jsem to správně nepochopil! :D
Takže po složení dohromady by měl kód tedy vypadat takhle?

     var url = "zdroj-ajaxchat.inc";
 
     if (url != 0)
     {
        if (window.ActiveXObject)
        {
          httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
        }
        else
        {
          httpRequest = new XMLHttpRequest();
        }
        httpRequest.open("GET", url, true);
        httpRequest.onreadystatechange= function () {processRequest(); } ;
        httpRequest.send(null);
      }
      else
      {
 
        document.getElementById("chatlist").innerHTML = "";
        
      }
}

var old="zdroj-ajaxchat.inc";
function processRequest()
{
  if (httpRequest.readyState == 4)
  {
    if(httpRequest.status == 200)
    {
      var mistoZobrazeni = document.getElementById("chatlist");
      if(old != httpRequest.responseText) {
        old  = httpRequest.responseText;
        mistoZobrazeni.innerHTML = old;
      }
    }
    else
    {
//pokud nebyl nenalezen soubor...
    }
  }
}

window.setInterval("aktualizovat()", 800);

V tomto složení totiž nefunguje :)
Keeehi
Profil
To už ani nedokážeš okopírovat text? Zapomněl jsi okopírovat dva řádky, tak se nemůžeš divit, že to nefunguje. Raději ti to tu dám celé:

function aktualizuj() {
    var url = "zdroj-ajaxchat.inc";
    var httpRequest;

    if (window.ActiveXObject) {
        httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
    } else {
          httpRequest = new XMLHttpRequest();
    }

    httpRequest.open("GET", url, true);
    httpRequest.onreadystatechange= function () { processRequest(httpRequest); } ;
    httpRequest.send(null);
}

var old="";
function processRequest(httpRequest) {
    if (httpRequest.readyState == 4 && httpRequest.status == 200 && old != httpRequest.responseText) {
        old  = httpRequest.responseText;
        document.getElementById("chatlist").innerHTML = old;
    }
}

window.setInterval(aktualizovat, 800);

Je to 24 řádků, tak to okopíruj všechno.
Radek9
Profil
rudla:
Celý to je podle mě špatně navržený. Zkus to posílat ze serveru v jiným formátu, třeba JSON. Vždycky by ti přišlo třeba i ID poslední zprávy a to bys při příštím požadavku posílal na script. Ten by ti vrátil pouze nový zprávy. Pak už by byla podmínka jednoduchá. Pokud bude objekt prádznej, nic se neděje. Pokud ne, udělej si Audio, přehraj, přidej zprávy a ulož nový ID.
rudla
Profil
Radek9:
To se řekne jednoduše. :)

Keeehi:
Díky, ale pořád to nefunguje. Tady se můžeš přesvědčit o tom, že je tam všechno.
Keeehi
Profil
rudla:
Moje chyba. Zapomněl jsem funkci předat proměnnou. V [#22] jsem to aktualizoval. Už by to mělo být správně.

Radek9:
rudla je rád, když to správně okopíruje. Jestli to za něj celé vytvoříš tak prosím, ale sám toho určitě není schopen.
weroro
Profil
Chcem sa opýtať. Je rozumné volať server každých 800 ms? Si predstavte 500 a viac užívateľov (ešte k tomu ak dáta nie sú v DB ale v súbore ako v tomto prípade).
Keeehi
Profil
weroro:
Rozumné to rozhodně není, avšak na něco víc se asi rudla moc nezmůže. Co by se tam dalo docela snadno přidělat je to, že pokud člověk dlouho nepíše, obnovuje se mu chat stále pomaleji. Podobně jako na chatu na lide.cz
rudla
Profil
weroro:
500 tam nikdy nebude, maximum bude 20 a to se stane v momentě, až já budu prezidentem.

Keeehi:

Funkce funguje, děkuju, Keeehi, ale abych se vrátil k původnímu záměru tématu. Předpokládám, že pípátko mám dát do podmínky
 if (httpRequest.readyState == 4 && httpRequest.status == 200 && old != httpRequest.responseText)
...že?

Ad Radek9:
Máš pravdu, na tohle jsem opravdu laik.


Přátelé, nakonec jsem to zmastil tak, že to funguje. Kód pro další návštěvníky a hledače tady: http://zatnaktel.unas.cz/conversations/data/zivaukazka-ajaxchat.html

Děkuju vám všem za snahu, hlavně Keeehimu a dobrou noc!
Toto téma je uzamčeno. Odpověď nelze zaslat.