Autor Zpráva
Duchaplny
Profil
Zdravím,

snažím sa spraviť súhrn udalostí v cykluse for (s podmienkami, a tak pod.), akurát mi nevyhovuje, že sa všetko, pri načítaní stránky, naraz vypíše. Radšej by som bol, keby sa riadky, po načítaní stránky, postupne vypisovali po sekundových intervaloch a najlepšie, aby to nezaťažovalo server. Je niečo také možné ?
yFang
Profil
Můžeš to udělat javascriptem pomocí funkcí setTimeout nebo setInterval, viz Časování
Duchaplny
Profil
yFang:
Vďaka, môžete mi ešte poradiť, ako to použijem v kombinácii s PHP, napr. v tomto cykle ?
<?php
      for ($i=1; $i<=10; $i++) {
           echo $i."<br />";}
?>
neviem ako to skombinovať, aby to fungovalo.
Alphard
Profil
Znáte dopředu všechna data? Jestli ano, ze serveru bych je při načtení stránky vysypal všechny prohlížeči, jen je skryl (pomocí css, ale prostřednictvím js, aby šly při zakázaném js vidět) a pak pomocí js postupně odkrýval.
Duchaplny
Profil
Alphard:
Znáte dopředu všechna data?

Áno, aj nie. Všetky data sú vlastne závislé od funkcie mt_rand(), resp. ten loop prebehne viac krát, cca 30x, a riadky vypisuje cez echo, podľa zodpovedajúcich podmienok, ktoré zodpovedajú náhodne vygenerovaným číslam. Nemám hotový celý script, ale uvediem jednoduchý príklad pre predstavu:
<?php
for ($i=1; $i<=30; $i++) {
     $roll = mt_rand(1,3);
        if ($roll=="1") {echo "1 <br />\n";}
    elseif ($roll=="2") {echo "2 <br />\n";}
      else {echo "3 <br />\n";}
                         }
?>
už len, aby to tie data nevysypalo naraz, ale postupne každý riadok po 1 sekunde. Čiže o 30 sekúnd, od odoslania, by mali byť všetky čísla zobrazené.
han5vk
Profil
Napriklad si mozes v tom cykle kazde cislo obalit do nejakeho elementu, napr. <b>, nastavis mu id podla poradia (iteracie toho for), napr. Takto:

if ($roll=="1") {echo "<b id=b".$i."> 1</b>\n";}
    elseif ($roll=="2") {echo "<b id=b".$i."> 2</b>\n\n";}
      else {echo "<b id=b".$i."> 2</b>\n\n";}

a potom nakoniec nejaky takyto skript (prvykrat som ho videl teraz na JPW, moze mat chybu, nemam to teraz ako odladit)
<script>

function odkryJednoCislo () {
     document.getElementById('b'+y.toString()).style='display: block';
}

var y=1;

while(y<31) {
   window.setTimeout("odkryJednoCislo()",1*1000);
y=y+1;

}

Zabudol som, ze na zaciatok treba vsetky skryt a to bud pomocou display:none alebo visibility:hidden. Pri visibility ti to dopredu zaberie miesto a teda web sa nebude posuvat. Potom ale treba upravit v odkryJednoCislo() display:block na visibility:visible.

Urcite sa najde lepsie riesenie, nie som expert, tak ma neukamenujte ;)
Duchaplny
Profil
han5vk:
upravujem ten JS už skoro 2 hodiny, ale stále ma chyby.
<script>
function odkryJednoCislo() {
  "use strict";
     document.getElementById("b"+y.toString()).style.display="block";
}
var y=1;
while(y<31) {
   window.setTimeout(function () {
    "use strict";
    odkryJednoCislo();
   }, 1000);
y=y+1;
}
</script>
posledná chyba:
Line 10: }, 1000);
Don't make functions within a loop.

Keď odstránim loop, tak to stráca zmysel. Keď do toho loopu nedám function (), ale dám:
   window.setTimeout("odkryJednoCislo();", 1000);
tak to hodí chyby:
Line 7: window.setTimeout("odkryJednoCislo();", 1000);
Implied eval. Consider passing a function instead of a string.

Line 1: function odkryJednoCislo() {
'odkryJednoCislo' is defined but never used.

Inside 'setTimeout' on line 7: odkryJednoCislo();
'odkryJednoCislo' is not defined.

Aj keď odstránim loop a nechám len y=1;, tak mi vypíše jedno číslo (1-3), ale
<b id=b1 style='display: none';> <číslo> </b>
nezmení na display: block; takže mám pocit, že toto nie je najšťastnejšie riešenie.
Duchaplny
Profil
nemohli by ste ma trošku popostrčiť ? vážne si neviem rady..
juriad
Profil
Funkční ukázka; pochopit to už musíš sám.
<div id="b0">b0</div>
<div id="b1">b1</div>
<div id="b2">b2</div>
<div id="b3">b3</div>
<div id="b4">b4</div>
<div id="b5">b5</div>
<div id="b6">b6</div>
<div id="b7">b7</div>
<div id="b8">b8</div>
<div id="b9">b9</div>

<script>
function genIds(count) {
        var ids = [];
        for(var i = 0; i < count; i++) {
                ids.push('b' + i);
        }
        return ids;
}

function showOneByOne(ids) {

        function hide(id) {
                document.getElementById(id).style.display = 'none';
        }

        function hideAll(ids) {
                for(var i = 0; i < ids.length; i++) {
                        hide(ids[i]);
                }
        }

        function show(id) {
                document.getElementById(id).style.display = 'block';
        }

        function showNext(ids, timeout) {
                if(ids.length > 0) {
                        window.setTimeout(function() {
                                id = ids.shift();
                                show(id);
                                showNext(ids, timeout);
                        }, timeout);
                }
        }

        myIds = ids.slice(0);
        hideAll(myIds);
        showNext(myIds, 1000);
}

var ids = genIds(10);
showOneByOne(ids);
</script>
Duchaplny
Profil
juriad:
Vďaka za ukážku, funguje naozaj výborne, ale mne to veľmi nepomohlo, pretože Vaša ukážka ráta s tým, že data budú zobrazené, však mne prechádzajú cez loop for a generujú sa náhodne funkciou mt_rand ako som písal v [#5].

Keď to spustím s Vašim JS scriptom, tak mi to síce čísla vypisuje pod seba v sekundových intervaloch, a všetko sa zdá byť ok, ale v skutočnosti sa ten loop vykonáva stále dokola, takže zobrazené výsledky vlastne ani nie sú aktuálne, a správne.

Ten loop by sa mal najskôr vykonať celý (v tomto prípade 30x), a až potom by mal začať vypisovať výsledné riadky v sekundových intervaloch.
juriad
Profil
Ale mě se sem opravdu nechce psát celý kód. To by sis to programování vůbec neužil.
<?php
for ($i = 0; $i < 10; $i++) {
  echo '<div id="b' . $i . '">' . rand(1, 3) . '</div>';
}
?>
<script>
...
</script>
Duchaplny
Profil
juriad:
Úprimne si ťažko niečo užijem, čo neovládam. Pozerám net už od včera večera. Skúšam rôzne scripty a prepisujem niečo, čomu ani sám nerozumiem, a úprimne som v koncoch. Jedna hlúposť, celý deň zabitý, a výsledok žiadny. Ten rand čo mám v scripte, je len ukážka, bude ich tam oveľa viac a vyššie čísla, ako aj tých podmienok tam bude viac, a u každého čísla iná hláška, preto nepotrebujem prerábať script, ale len spraviť nejaký jednoduchý JS script, ktorý mi tie riadky bude postupne po jednom každú sekundu vypisovať.
Kcko
Profil
Duchaplny:
Jedna hlúposť
Tak jak vidíš taková hloupost to asi není. Taky tu máš sekci Práce a zakázky (řešení jsi už dostal a pokud na to nemáš, tak si to prostě zaplať).
Duchaplny
Profil
Kcko:
řešení jsi už dostal a pokud na to nemáš, tak si to prostě zaplať
Tak vďaka, dobrá rada nadovšetko, ale úprimne si nemyslím, že som dostal riešenie, keby áno, už sa tým nezaoberám..
juriad
Profil
Duchaplny:
Jednotlivé vypisované řádky obalíš nějakým elementem, například divem, kterému nastavíš id. Víc už tady snad nelze říct.
<?php
for ($i = 0; $i < 10; $i++) {
  echo '<div id="b' . $i . '">';
   # tady vypíšeš výsledek toho tvého super složitého tajného výpočtu
   echo '</div>';
}
?>
Duchaplny
Profil
juriad:
Asi som už unavený, niet divu po vyše 10 hodinách, lebo neviem juriad, nechcem sa Vás dotknúť, ale buď ma nechápete alebo si stále idete podľa seba.

Každopádne skúšal som funkciu sleep(), ktorá už asi nefunguje tak ako kedysi, pretože vždy dostanem "Fatal error: Maximum execution time of 30 seconds exceeded":
<?php
for ($i=1; $i<=30; $i++) {
    $roll = mt_rand(1,3);     
    if ($roll == "1")
        echo "1 <br />\n";
    else if ($roll == "2")
        echo "2 <br />\n";
    else
        echo "3 <br />\n";

    // Flush the output buffer
    ob_flush();
    // Sleep for one second
    sleep(1);
?>
}
to isté aj druhý pokus:
<?php 
@ini_set("output_buffering", "Off");
@ini_set('implicit_flush', 1);
@ini_set('zlib.output_compression', 0);
@ini_set('max_execution_time',1200);


header( 'Content-type: text/html; charset=utf-8' );


echo "Testing time out in seconds\n";
for ($i = 0; $i < 1150; $i++) {
    echo $i." -- ";

    if(sleep(1)!=0)
    {
        echo "sleep failed script terminating"; 
        break;
    }
    flush();
    ob_flush();
}
?>



ešte ma napadlo, či by bolo možné spraviť ten loop a všetky výsledky (30 riadkov) niekam uložiť, a potom ich postupne začať cez JS vypisovať po sekundách ?
han5vk
Profil
Veď ty si ich uložíš priamo do HTML, a potom to javascript skryje, a postupne odkrýva. Nepochopiteľné? K tej rade, rada je to dobrá a nemáš sa čo sťažovať. juriad ti tu fakt toho napísal dosť veľa, stačí si to len spojiť. Ideš na to zle, keď lepíš čomu nerozumieš, skús si jednotlivé veci vyhľadať, naštudovať, a pochopíš kde je chyba. Mimochodom, funkcia sleep pozastaví php skript, a stránka na tento skript čaká, nevypisuje to po jednom, ale počká až dokončí php a potom to vypíše naraz. Max execution time je tam naschvál, aby sa zastavil skript pri zacyklení php alebo niečom podobnom.
Duchaplny
Profil
han5vk:
Ok, možno máš pravdu, asi som to chcel urobiť jednoduchšie.. dostalo ma, keď som skúsil ten script a pri vypisovaní mi síce čísla ukazoval pekne po sekundách, ale stále generoval nové a nové čísla, vďaka čomu boli výsledky neaktuálne..

BTW: ten druhý script s funkciou sleep mi nabehol, keď som upravil $i < 1150 na nižšie číslo, a zatiaľ to funguje podľa predstáv. Vďaka za rady všetkým a ospravedlňujem sa, ak som sa niekoho dotkol, (už) 11 hodín je 11 hodín.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: