Autor | Zpráva | ||
---|---|---|---|
rudla Profil |
#1 · Zasláno: 18. 7. 2012, 16:55:08
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 |
#2 · Zasláno: 19. 7. 2012, 16:11:43
Opravdu nikdo neví?
|
||
Kcko Profil |
#3 · Zasláno: 19. 7. 2012, 16:58:49
|
||
rudla Profil |
#4 · Zasláno: 19. 7. 2012, 17:38:43
Kcko:
Děkuju, to je sice dobré, ale mně jde o to, jak udělat podmínku, podle které to zareaguje. |
||
Keeehi Profil |
#5 · Zasláno: 19. 7. 2012, 17:42:57
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 |
#6 · Zasláno: 19. 7. 2012, 17:52:10
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 |
#7 · Zasláno: 19. 7. 2012, 18:31:16
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 |
#10 · Zasláno: 19. 7. 2012, 20:52:50
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 |
#11 · Zasláno: 19. 7. 2012, 20:59:03
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 |
#12 · Zasláno: 19. 7. 2012, 21:02:23
Chamurappi:
Takže jak je to správně? |
||
Keeehi Profil |
#13 · Zasláno: 19. 7. 2012, 21:15:09
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í ht>tp://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 |
#14 · Zasláno: 19. 7. 2012, 22:35:15
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 |
#15 · Zasláno: 20. 7. 2012, 15:17:34
Podle všeho to asi nebude správně, když mám dojem, že je to celé. Script nefunguje.
|
||
Keeehi Profil |
#16 · Zasláno: 20. 7. 2012, 15:47:05
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 |
#18 · Zasláno: 20. 7. 2012, 17:18:18
Dodej odkaz na živou ukázku.
|
||
rudla Profil |
#19 · Zasláno: 20. 7. 2012, 22:20:02
|
||
Keeehi Profil |
#20 · Zasláno: 20. 7. 2012, 22:36:55
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 |
#21 · Zasláno: 20. 7. 2012, 23:08:40
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 |
#24 · Zasláno: 21. 7. 2012, 00:12:22
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 |
#25 · Zasláno: 21. 7. 2012, 00:29:08
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 |
#27 · Zasláno: 21. 7. 2012, 01:18:34
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) 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! |
||
Časová prodleva: 12 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0