Autor Zpráva
Martin02
Profil
Ahoj,
prosimvás, můžete mi někdo poradit? Proč tento kód nefubguje?
<script type="text/javascript">
    function updatecas() {
      var cas = new Date();

      if(cas.getDate().toString().length == 1) {
        var den = "0" + cas.getDate().toString();
      } else {
        var den = cas.getDate().toString();
      }

      if(cas.getMonth().toString().length == 1) {
        var mesic = "0" + cas.getMonth().toString();
      } else {
        var mesic = cas.getMonth().toString();
      }
      
      var rok = cas.getFullYear();
      
      if(cas.getHours().toString().length == 1) {
        var hodina = "0" + cas.getHours().toString();
      } else {
        var hodina = cas.getHours().toString();
      }
      
      if(cas.getMinutes().toString().length == 1) {
        var minuta = "0" + cas.getMinutes().toString();
      } else {
        var minuta = cas.getMinutes().toString();
      }
      
      if(cas.getSeconds().toString().length == 1) {
        var sekunda = "0" + cas.getSeconds().toString();
      } else {
        var sekunda = cas.getSeconds().toString();
      }
      
      var menoDne = cas.getDay;
      switch(menoDne) {
        case "1":
          var pondeli = "podělí ";
          break;
        case "2":
          var utery = "úterý ";
          break;
        case "3":
          var streda = "středa ";
          break;
        case "4":
          var ctvrtek = "čtvrtek ";
          break;
        case "5":
          var patek = "pátek ";
          break;
        case "6":
          var sobota = "sobota ";
          break;
        case "7":
          var nedele = "neděle ";
          break;            
      }
      var nazevDne = [pondeli, utery, strda, ctvrtek, patek, sobota, nedele];
      
      document.getElementById("cas").innerHTML = "Dnes je " + nazevDne + den + "." + mesic + "." + rok + " " + hodina + ":" + minuta + ":" + sekunda;
      }
      setInterval("updatecas()",500)
    </script>

Děkuji
Witiko
Profil
var menoDne = cas.getDay; --> var menoDne = cas.getDay(); případně jen switch(cas.getDay()) {} , proměnná se jinde nepoužívá.
var nazevDne = [pondeli, utery, strda, ctvrtek, patek, sobota, nedele]; --> var nazevDne = ["pondeli","utery","streda","ctvrtek","patek", "sobota","nedele"];
setInterval("updatecas()",500); --> setInterval(updatecas, 500);

No a co se kódu týče (ne funkcionality):
      if(cas.getMinutes().toString().length == 1) {  // Dvojité volání jedné a té samé funkce
        var minuta = "0" + cas.getMinutes().toString(); // Dvojité volání jedné a té samé funkce, Dvojitá deklarace
      } else {
        var minuta = cas.getMinutes().toString(); // Dvojitá deklarace
      }
      
...
      
      document.getElementById("cas").innerHTML = ...; // Každých 500 milisekund voláme funkci na nalezení jednoho a toho samého elementu

Dvojité volání jedné a té samé funkce: Navrácenou hodnotu stačí uložit do proměnné a není třeba funkci volat mnohonásobně.
Dvojitá deklarace: Stačí si proměnné nadeklarovat prázdné jednou na začátku funkce a pak do nich přiřazovat. Deklarace a přiřazení proměnné není jedno a to samé. Jakmile je kdekoliv v těle funkce deklarována funkce klíčovým slovem var, je podobně jako funkce první třídy (deklarované pomocí klíčového sova function) deklarována po celou dobu exekuce funkce s hodnotou undefined, dokud ta není přiřazena; dvojitá deklarace je tudíž zbytečná.
Každých 500 milisekund voláme funkci na nalezení jednoho a toho samého elementu: Stačí uložit element do globální proměnné, tedy:

<script type="text/javascript">
var element;
window.onload = function() {
  element = document.getElementById("cas");
  setInterval(updatecas, 500);
}

...


To je vše, čeho jsem si všimnul.
Martin02
Profil
Zkoušel jsem to podle toho změnit, ale var nazevDne = ["pondeli","utery","streda","ctvrtek","patek", "sobota","nedele"]; s uvozovkama mi vypíše "pondeli,utery,streda...". Pak jsem to zkusil trochu poupravit na tohle(ukazuji pouze koncový hlavní kód scriptu):
var menoDne = cas.getDay();
      switch(menoDne) {
        case 1:
          var pondeli = "pondělí ";
          break;
        case 2:
          var utery = "úterý ";
          break;
        case 3:
          var streda = "středa ";
          break;
        case 4:
          var ctvrtek = "čtvrtek ";
          break;
        case 5:
          var patek = "pátek ";
          break;
        case 6:
          var sobota = "sobota ";
          break;
        case 7:
          var nedele = "neděle ";
          break;            
      }
      var nazevDne = [pondeli || utery || streda || ctvrtek || patek || sobota || nedele];
      
      document.getElementById("cas").innerHTML = "Dnes je " + nazevDne + den + ". " + mesic + ". " + rok + "  " + hodina + ":" + minuta + ":" + sekunda;
      }
      setInterval(updatecas), 500;

Takže jsem vymazal uvozovka u čísel dnů a místo čárek v poli nazevDne jsem dal ||. Teď už vše funguje. Děkuji za radu, dost mi to mohlo.
Witiko
Profil
Martin02:
Tohle je velice zvrhlý kód... Pro účel rekapitulace: Tvůj kód dělá (v případě, že bys to nevěděl) následující -

Nadeklaruješ si 7 proměnných pro každý den v týdnu, přičemž do jedné z nich uložíš text shodný s jejím jménem. Poté vybereš jednu z těchto 7mi proměnných, která má přiřazenou hodnotu a tu uložíš do prvního segmentu pole, jehož obsah poté vypíšeš. Navíc máš chybu v zápisu:
setInterval(updatecas), 500; /* místo */ setInterval(updatecas, 500);

Většina prohlížečů bere vynechání argumentu času jako pokyn k tomu, aby spouštěla danou funkci co nejrychleji, což asi není kýžené, když v případě odpočítávání bohatě stačí interval jedné sekundy, jelikož setInterval časové rozestupy udržuje a "nerozlézá se" postupem času.

Co si třeba vytvořit proměnnou jednu, do ní uložit jméno dne a pak ji vypsat? Není to "trochu" jednodušší? Namísto tebou vypsaného zvaž použití následujícího kódu:
      var nazevDne;
      switch(cas.getDay()) {
        case 1:
          nazevDne = "pondělí";
          break;
        case 2:
          nazevDne = "úterý";
          break;
        case 3:
          nazevDne = "středa";
          break;
        case 4:
          nazevDne = "čtvrtek";
          break;
        case 5:
          nazevDne = "pátek";
          break;
        case 6:
          nazevDne = "sobota";
          break;
        default:
          nazevDne = "neděle";          
      }
      document.getElementById("cas").innerHTML = "Dnes je " + nazevDne + " " + den + ". " + mesic + ". " + rok + "  " + hodina + ":" + minuta + ":" + sekunda;
      }
      setInterval(updatecas, 1000);
Martin02
Profil
Hele, já nejsem žádný expert na tohle, mě jde jen o to, aby mi fungovala funkce, která zobrazuje datum a čas a na tom ostatním mi ani moc nezáleží, ale asi máš pravdu, že je to jednodušší.
dík
TomasJ
Profil
Jednodušší?!
Podle mě je jednodušší toto:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script>
var Dny = ["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],elem_cas;
window.onload=function(){elem_cas=document.getElementById("cas");setInterval(GetTime,1000);}
function Edit(val){if(val.toString().length==1){return "0"+val;}else{return val;}}

function GetTime()
{
  var cas = new Date(),
  d = Edit(cas.getDate()),
  m = Edit(cas.getMonth()),
  y = cas.getFullYear(),
  h = Edit(cas.getHours()),
  i = Edit(cas.getMinutes()),
  s = Edit(cas.getSeconds()),
  str_d = Dny[cas.getDay()];
  elem_cas.innerHTML="Dnes je "+str_d+", "+d+"."+m+". "+y+" - "+h+":"+i+":"+s;  
}
</script>
</head>
<body>
<span id="cas"></span>
</body>
</html>


EDIT: Tohle jsem sepsal asi za 5 minut.
Šlo by to ještě kratší, ale to bych musel vynechat proměnné a dosazovat do řetězce přímo, jenže to už by nebylo přehledné.
Martin02
Profil
sry, ale tomu tvému kódu vůbec nerozumím :( (ne pro to, že by nebyl přehledný, ale pro to, že vůbec nevím jak se používá a co je třeba elem_cas, Edit(val) atd. Zkrátka js neumim moc dobře, ale mě tamten kód fungoval, takže dobrý)
TomasJ
Profil
Martin02:
Dobrá trochu ti to rozepíšu.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script>
var Dny = ["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"], elem_cas; //Vytvoření pole Dny a proměnné elem_cas.

window.onload=function(){ //Po načtení okna se stane toto:
elem_cas=document.getElementById("cas"); //Do proměnné elem_cas se načte element navrácený z jeho id ("cas").
setInterval(GetTime,1000); //Nastaví se interval na obnovu času (zde 1 sekunda).
}

function Edit(val){ //Funkce pro přidělování nuly před jednomístná čísla.
if(val.toString().length==1){return "0"+val;} //Pokud má vstupní hodnota délku 1 znak, vrátí nulu a za ní vstupní hodnotu.
else{return val;} //V obráceném případě vrátí pouze hodnotu (tak jak přišla).
}

function GetTime() //Již samotná funkce na zjištění času.
{
  var cas = new Date(), //Vytvoření instance času.
  d = Edit(cas.getDate()), //den
  m = Edit(cas.getMonth()), //měsíc
  y = cas.getFullYear(), //rok
  h = Edit(cas.getHours()), //hodina
  i = Edit(cas.getMinutes()), //minuta
  s = Edit(cas.getSeconds()), //sekunda
  str_d = Dny[cas.getDay()]; //den slovně
  elem_cas.innerHTML="Dnes je "+str_d+", "+d+"."+m+". "+y+" - "+h+":"+i+":"+s; //Do obsahu elementu se zapíše čas.
}
</script>
</head>
<body>
<span id="cas"></span>
</body>
</html>


EDIT: Speciálně pro tebe živá ukázka

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