Stránka: 1 z 1
| [ Príspevkov: 13 ] | |
| Autor | Správa |
|---|
Registrovaný: 16.07.07 Prihlásený: 31.07.22 Príspevky: 1225 Témy: 92 | 92 |
Zdravim, na stranke si cez ajax ziskavam udaje z db a nasledne vypisujem, no mam problem, ze mam 2 divy, kde do jedneho potrebujem udaje z jednej tabulky v sekundovej tarifikacii a do druheho mi staci 10 sekundove obnovovanie...
Tu mam kody:
Kód: function loaduj(){ if (window.XMLHttpRequest){ xmlhttp = new XMLHttpRequest(); } else{ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange = function(){ if (xmlhttp.readyState == 4 && xmlhttp.status == 200){ document.getElementById("change").innerHTML = xmlhttp.responseText; init(); } } var url = "ajax/aukcia_ajax.php"; var params = "idak=<?php echo $id_aukcie; ?>"; xmlhttp.open("GET", url+"?"+params, true); xmlhttp.send(); }
function kliky(){ if (window.XMLHttpRequest){ xmlhttp = new XMLHttpRequest(); } else{ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange = function(){ if (xmlhttp.readyState == 4 && xmlhttp.status == 200){ document.getElementById("klikyyy").innerHTML = xmlhttp.responseText; init(); } } var url = "ajax/aukcia_kliky.php"; var params = "idak=<?php echo $id_aukcie; ?>"; xmlhttp.open("GET", url+"?"+params, true); xmlhttp.send(); }
function init(){ var t = setTimeout("loaduj()",1000); } Na stranke to potom pustam : Kód: <body onload="init()">
<div id="change"> Loading... </div>
<div id="klikyyy"> loading </div>
Uz som to skusal vseliako "kombinovat" aj urobit si funkciu init2 a do body onload to dat tiez, ale nepomohlo... vzdy sla len jedna funkcia, pripadne skakala funkcia loaduj do divu pre funkciu kliky... Ako nato?
|
|
Registrovaný: 11.08.07 Príspevky: 4088 Témy: 34 | 34 Bydlisko: Brno |
V podstate je pointa v tom, ze v tele tvojich fcii miesto volania fcie init len prosto zavedies novy timeout, cim obe fcie od seba mozes oddelit a pre kazdu nastavovat osobitny timeout. Ja ti ukazem sposob, ako to zvyknem zapisovat ja. Este by som ta rad upozornil, ze ako prvy argument setTimeoutu pouzivas retazec, co nie je doporucovane - pouzi referenciu na prislusnu fciu.
Kód: setTimeout(function kliky() //fciu som pomenoval { //...sem si dopln lubovolny kod... xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { //...sem tie srandy s innerHTML... setTimeout(kliky, 1000); //tu je pouzite to meno fcie } }; }, 1000); Dobre si vsimni, ako som to zapisal. Tento isty kod potom pouzijes druhykrat s cislom 10000 (je to tam na dvoch miestach), zasa s lubovolnym kodom vnutri.
Ono to pracuje tak, ze sa spusti odpocitavanie jednej sekundy (ten "vonkajsi" setTimeout), spusti sa kod vo function kliky(), na ktoreho konci je zasa prikaz, aby sa pockalo sekundu a rekurzivne sa fcia kliky zavolala, a tak dookola.
Este ta upozornim, ze je tu pouzity operator function a nie prikaz function, preto ten nazov "kliky" nemozes pouzit nikde inde ako vnutri tela samotnej fcie kliky. Vsade inde by ti volanie kliky() vyhodilo vynimku.
Bola by tu v podstate este jedna moznost, a to pouzitie setIntervalu, co by zabezpecilo cyklicke opakovanie tvojho pozadovaneho kodu, ale z dovodov, ktore sa mi nechce momentalne rozpisovat, urcite neodporucam pouzivat setInterval. Keby bol zaujem, nieco poviem aj k tomu, ale myslim, ze ti staci informacia, aby si sa setIntervalu vyhol.
Otazka pomimo - nechces nahodou tieto dve ajaxove volania spustit aj pri nacitani stranky? Totizto v tvojom (a aj mojom) kode sa tieto fcie prvykrat spustia sekundu, resp. desat sekund po otvoreni stranky - ma to tak byt?
|
|
Registrovaný: 16.07.07 Prihlásený: 31.07.22 Príspevky: 1225 Témy: 92 | 92 |
Vdaka duri, vyborne vysvetlene, cením si to.
A k tej otazke pomimo, zatial som to riesil tak, ze do divu klikyyy som si dal php script ktory pri nacitani stranky vytiahne udaje z db... A potom ked sa pusti ajax script, tie udaje proste prepise. Asi nie moc stastne riesenie, ale funguje  Ak sa ti chce mi to este vysvetlit, nebudem sa tomu branit 
|
|
Registrovaný: 11.08.07 Príspevky: 4088 Témy: 34 | 34 Bydlisko: Brno |
Je to dobre riesenie, mozes nechat tak.
|
|
Registrovaný: 16.07.07 Prihlásený: 31.07.22 Príspevky: 1225 Témy: 92 | 92 |
Ešte otázočka. Môže byť že mam slabý net / hosting nestíha zobrazovat nove udaje?
Kedze v pc na wampe mi to ide ako má?
A občas sa stane že sa do divu klikyyy hodia informacie ktore maju byt v dive change? Občas sa to obnovi samo, obcas az po F5...
|
|
Registrovaný: 11.08.07 Príspevky: 4088 Témy: 34 | 34 Bydlisko: Brno |
To prve sa stat moze, to druhe urcite nie. Daj odkaz na zivu ukazku, nech sa pozriem.
|
|
Registrovaný: 16.07.07 Prihlásený: 31.07.22 Príspevky: 1225 Témy: 92 | 92 |
Takze zase som sa do toho pustil a nie a nie to ist...
Link: http://aukcia.dobrestranky.eu/index.php?page=aukcia&idak=6
Po určitom čase sa bud zastavi cas alebo prestane sa aktualizovat zoznam klikov. Ved skuste si to, login/heslo : fero/fero
+ obcas stale skoci odpocitavanie do divu pre historiu klikov alebo naopak
Tu mam kod:
Kód: setTimeout(function loaduj() { if (window.XMLHttpRequest){ xmlhttp = new XMLHttpRequest(); } else{ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange = function(){ if (xmlhttp.readyState == 4 && xmlhttp.status == 200){ document.getElementById("change").innerHTML = xmlhttp.responseText; setTimeout(loaduj, 1000); } } var url = "ajax/aukcia_ajax.php"; var params = "idak=<?php echo $id_aukcie; ?>"; xmlhttp.open("GET", url+"?"+params, true); xmlhttp.send(); }, 1000);
setTimeout(function kliky() { if (window.XMLHttpRequest){ xmlhttp = new XMLHttpRequest(); } else{ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange = function(){ if (xmlhttp.readyState == 4 && xmlhttp.status == 200){ document.getElementById("klikacka").innerHTML = xmlhttp.responseText; setTimeout(kliky, 3000); } } var url = "ajax/aukcia_kliky.php"; var params = "idak=<?php echo $id_aukcie; ?>"; xmlhttp.open("GET", url+"?"+params, true); xmlhttp.send(); }, 3000);
Spustam to sposobom body onload="loaduj(); kliky();"
Ked nastavim timeout oboch funkcii na 1000, funkcia loaduj sa ani nepusti, ked je to takto ze jedna 1000 a druha 3000 chvilu to ide, ale potom prestane ist bud odpocitavanie alebo sa prestane obnovovat zoznam prihodeni... UZ fakt neviem co s tym, prosim pomoc...
|
|
Registrovaný: 11.08.07 Príspevky: 4088 Témy: 34 | 34 Bydlisko: Brno |
Tie fcie sa spustaju automaticky, po jednej, resp. troch sekundach, pouzivat udalost onload nie je spravne, odstran to. To je ten pripad, na ktory som ta upozornoval:
Citácia: Este ta upozornim, ze je tu pouzity operator function a nie prikaz function, preto ten nazov "kliky" nemozes pouzit nikde inde ako vnutri tela samotnej fcie kliky. Vsade inde by ti volanie kliky() vyhodilo vynimku. Tazko sa to vysvetluje. Otvor si JS konzolu (vo vyvojarskych nastrojoch v prehliadaci) a zadaj tam: Kód: function f(){} Uvidis, ze ti tento vyraz vratil undefined (teda nevratil ziadnu hodnotu) - toto je teda prikaz function, ktory zadefinoval fciu f. Skus si ale taketo: Kód: var g = function f(){}; Tu samotny vyraz function f(){} musi vracat hodnotu, aby ju bolo mozne priradit do premennej g. Preto je tu function ako operator. V tomto pripade si mozes vyskusat (nie v IE), ze typeof f je undefined - mimo tela fcie je f uz nedefinovane. Presne na tento problem si narazil aj ty, fcia kliky sa zadefinovala len vo vlastnom tele (preto je mozne je pouzit setTimeout(kliky, 3000), ale mimo vlastneho tela (cize napr. v <body onload>) je uz kliky nedefinovane. Ja sa ospravedlnujem, ze je to taketo komplikovane, ale pisem kody vzdy tak, aby sa mne co najpraktickejsie zapisovali, len nie kazdy sa v tom vyzna. Ak chces svoje fcie loaduj a kliky spustat pri nacitani stranky - pravdepodobne to si sa snazil docielit onloadom - je riesenie jednoduche. Vyhod ten vonkajsi setTimeout, tym sa z operatoru function stane prikaz function (kedze nebude musiet vracat hodnotu) a budu fcie zadefinovane ako globalne: Kód: function kliky() { //telo setTimeout(kliky, 3000); } ... <body onload="kliky();">
|
|
Registrovaný: 16.07.07 Prihlásený: 31.07.22 Príspevky: 1225 Témy: 92 | 92 |
Nič. Stále nič...
Aj ked odstranim vonkajši timeout, dam do body onload funkcie, aj ked odstranim onload, stale sa to po urcitej dobe zasekne...
Pokiaľ mam nastavene vonkajšie timeouty a nemam body onload, zase preskakuje cas do divu pre historiu prihodeni alebo naopak... Uz fakt neviem, ci som uz natom ja tak zle ze nechapem co pises, alebo to proste nefunguje...
Lebo vsetko co si popisal som vyskusal, bez uspechu
|
|
Registrovaný: 11.08.07 Príspevky: 4088 Témy: 34 | 34 Bydlisko: Brno |
Vies, kde moze byt este chyba? Ty premenne xmlhttp nedefinujes ako lokalne pre obe fcie, ale pretoze si nepouzil klucove slovo var, zadefinovalo sa xmlhttp ako vlastnost globalneho objektu window, preto prakticky loaduj() a kliky() pouzivaju ten isty XMLHttpRequest objekt. Zrejme preto sa to bije. http://diskuse.jakpsatweb.cz/?action=vt ... 106539#var
|
|
Registrovaný: 16.07.07 Prihlásený: 31.07.22 Príspevky: 1225 Témy: 92 | 92 |
Ten var som pridal tuto:
Kód: if (window.XMLHttpRequest){ var xmlhttp = new XMLHttpRequest(); } else{ var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
Zatial to ide.. Je to takto spravne?
|
|
Registrovaný: 11.08.07 Príspevky: 4088 Témy: 34 | 34 Bydlisko: Brno | |
Registrovaný: 16.07.07 Prihlásený: 31.07.22 Príspevky: 1225 Témy: 92 | 92 |
Ďakujem Ďuri, si pán 
|
|
Stránka: 1 z 1
| [ Príspevkov: 13 ] | |
|