Autor Zpráva
grossik
Profil
    <script>    
    var time_server = <?php echo round(microtime(true) * 1000); ?>;
    
    function time_set() {
        var cas_aktualne = time_server;
        var konec = <?php echo strtotime($konec) * 1000; ?>;
        var prave_delka = konec - cas_aktualne;
        var delka = <?php echo $delka * 1000 ?>;
        var percentage_hlidka = (prave_delka/delka) * 260;
        
        document.getElementById('progresss_hlidka').style.width = percentage_hlidka;  
        console.log(time_server);
    }
    window.setTimeout(function () { window.setInterval(time_set, 1000); time_set(); }, 1000 - time_server % 1000);            
      </script>

Ahoj, mám problém s aktualizací serverového času (time_server). Vždy to do console vypíše jen hodnutu při spuštění, vím že za to může PHP, ale nevím jak to udělat jinak. Poradí mi někdo?
juriad_
Profil *
grossik:
To proto, že PHP běží a skončí dlouho před tím, než stránka stáhne do prohlížeče a tam spustí JS. Později už nemáš přístup do PHP, kromě poslání nového požadavku (při přístupu na jinou stránku, refreshi, nebo AJAXem).
grossik
Profil
juriad:
Takže budu muset nějak použít AJAX?
juriad_
Profil *
grossik:
Ne, použij čas v prohlížeči.

var start = + new Date(); // kdy se načte stránka v prohlížeči
var celkem = <?php echo $celkemMiliSekund; ?>; // celková délka v milisekundách
var ubehlo = <?php echo $ubehloMiliSekund; ?>; // kolik už prohěhlo podle serveru

var interval = window.setInterval(function() {
  var ted = + new Date();
  var ubehloTed = ubehlo + (ted - start); // kolik milisekund už celkem prohěhlo
  var procenta = ubehloTed / celkem * 100; // kolik procent je hotových
  document.getElementById('progresss_hlidka').style.width =  + "%"; // nastavíme styl
  if (procenta >= 100) { // pokud je hotovo
    window.clearInterval(interval); // zrušíme intervalovou aktualizaci
    // tady můžeš třeba vykreslit hotovou hlídku 
  }
}, 1000); // každou sekundu



9. řádka je samozřejmě:
 = procenta + "%";
grossik
Profil
juriad:
Díky, ale je to problém s tou podmínkou.

    var start = + new Date();
    var konec = <?php echo strtotime($konec) * 1000; ?>;
    
    var interval = window.setInterval(function() {    
        var cas_aktualne = + new Date();    
        var prave_delka = konec - cas_aktualne;
        var delka = <?php echo $delka * 1000 ?>;
        var percentage_hlidka = (prave_delka/delka) * 260;
        document.getElementById('progresss_hlidka').style.width = percentage_hlidka;  
        if(percentage_hlidka >= 260) {
            window.clearInterval(interval);
            <?php echo "hotovo";?>
        }    
    }, 1000);    

Jenže žádné hotovo se nevypíše.
juriad_
Profil *
grossik:
Já jsem se snažil napsat skript tak, aby byl nezávislý na rozdílu času mezi prohlížečem a serverem, tys to zrušil, ale nevadí.
Uvědomuješ si, že na 7. řádku budeš postupně dostávat menší a menší čísla až to nakonec bude 0, protože se přibližuješ konci. Bude se ti tedy snižovat i percentage_hlidka.

Ten hlavní problém je však na 12. řádku. Co si myslíš, že se tam má stát? PHP tam, do skriptu vypíše hotovo ještě dřive než se skript spustí v prohlížeči. A co se stane až podmínka bude splněná (což se nestane, jak jsem napsal výše)? JavaScript narazí na nedefinovanou proměnnou hotovo a skončí chybou.

V prohlížeči stitkni Ctrl+U a podívej se jak ten JavaScript vypadá. Snad tak pochopíš rozdíl mezi JS a PHP.
grossik
Profil
juriad:
Nene na 7. řádku ta délka je závislá na tom, jak dlouho to bude trvat, takže například hráč zadá, že chce aby hlídka trvala 10 minut tak se do databáze uloží číslo 600. Jedná se o to že je určitý čas, který je z databáze (kdy hráč spustil hlídku) a k tomu se přičte ta délka (tedy jak jsem uváděj výše tak 600 sekund) a od toho času se odečítá čas podle toho jaký je čas no a ten čas (prave_delka) se vydělí délkou (10 minut), ale přidáno * 1000 aby hodnota byla v rozmezí 0 až 1 a ta se pak vykrátí 260 (protože tam mám progress bar který má šířku 260px). Nevím jestli jsem to napsal správně a tak, aby jsi to pochopil přesně tak, jak jsem to myslel.
juriad_
Profil *
Rozumím ti, mýlíš se však.
Proměnná delka je pořád stejná, stejně tak proměnná konec. Proměnná prave_delka je pokaždé menší, protože od konec odečítáš stále větší hodnotu (cas_aktualne v našem vesmíru jen roste).
grossik
Profil
juriad:
Takže když přidám ubehlo jak si psal ty a udělám u prave_delka jak si psal ty ubehlo + (ted - start) tak by to fungovalo? Nebo to chápu pořád špatně? Pokud to chápu dobře tak budu muset zjistit to, kolik už uběhlo.
juriad_
Profil *
Když znáš konec a delka, je opravdu tak těžké (už v PHP) vypočítat ubehlo?

Vlož si za 8. řádek:
console.log(percentage_hlidka)
a uvidíš, že hodnoty opravdu klesají.

Druhý problém je pak s tím hotovo.
Pro začátek to změň na:
alert("hotovo");
PHP do toho zatím netahej.
grossik
Profil
juriad:
To PHP tam bylo jen na test. Však klesají to je dobře, má se to odečítat a jak bude hodnota 0 tak se to má zastavit. Asi jsem to předtím napsal špatně.

        if(percentage_hlidka == 0) {
            window.clearInterval(interval);
            alert("hotovo");
        }    

Jenže se nezastaví.
juriad_
Profil *
<= 0
Jaka by to byla nahoda, ze se strefi presne na milisekundu.
grossik
Profil
Už mi to funguje děkuju moc.
Celý kód je teda takto:
    <script>    
    var start = + new Date();
    var konec = <?php echo strtotime($konec) * 1000; ?>;
    
    var interval = window.setInterval(function() {    
        var cas_aktualne = + new Date();    
        var prave_delka = konec - cas_aktualne;
        var delka = <?php echo $delka * 1000 ?>;
        var percentage_hlidka = (prave_delka/delka) * 260;
        console.log(percentage_hlidka)
        document.getElementById('progresss_hlidka').style.width = percentage_hlidka;  
        if(percentage_hlidka <= 0) {
            window.clearInterval(interval);
            location.reload();
        }    
    }, 1000);    
      </script>

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:

0