Autor Zpráva
Joan
Profil
Mám problém s předáním vložené hodnoty a jejím doplněním do value inputu: V HTML kódu mám:
<form name="fm">
<input type="text" id="zadano" name="zadano" size=20 value="Bylo zadáno: ">
<input type="text" id="sekundy" name="sekundy">
</form>

což se objeví při natažení stránky. K této hodnotě "Bylo zadáno: " chci skriptem dopsat hodnotu, která byla vložena uživatelem:
c = parseInt(document.fm.sekundy.value); 
var k;          
            k == c;
            document.fm.zadano.value = +k+ " sekund"; 

a rázem se mi původní value "Bylo zadáno: " přepíše na "NaN sekund" místo např. "Bylo zadáno: 300 sekund".

Já vím, skript nefunguje jak má, ale konečně něco vypisuje ale bohužel přepisuje (místo doplnění) value deklarovanou v HTML. Doufám marně, že když přijdu na to, jak hodnotu value v inputu místo přepsání doplnit, tak že zároveň vyřeším to "NaN"?
_es
Profil
Joan:
Čo má podľa teba asi tak robiť príkaz: k == c;?
Príkaz: document.fm.zadano.value = +k+ " sekund"; bude spracovaný ako: document.fm.zadano.value = (+k) + " sekund";
A (+undefined) je NaN, teda špeciálna hodnota (nečíslo) (not a number).
Joan
Profil
_es:
No teda! Umazala jsem zapomenuté plusko a už je z NaN najednou Undefined. Moje přání je, aby hodnota v sekundách, zadaná do inputu s name="sekundy" se vepsala rovněž do políčka s name="zadano", ale na rozdíl od prvního inputu se neodečítala, pouze zůstala vepsaná. Prostě pro kontrolu, kolik sekund jsem zadala. A ne a ne to dát dohromady. Hodnota v proměnné "c" je číslo, tak proč v proměnné "k" najednou číslo není? A jak je to prosím s tím přepisováním v inputu?
Davex
Profil
Pro přířazení hodnoty do proměnné k má být pouze jedno rovnítko na řádku k == c;.
Joan
Profil
Davex:
To jsem zkusila jako první, ale jedno rovnítko odečítá, což nechci. Dvě rovnítka ponechají část textu, který chci, akorát místo počtu sekund vypíše undefined. Omlouvám se velmi, bude-li to bráno jako duplicita. Podmínka IF tam nesmí být vůbec, to pak tento kousek skriptu nereaguje vůbec.
Davex
Profil
Výraz (porovnání) k == c se jen vyhodnotí a výsledek se nikam neuloží.

Na ten skript jsem se díval před několika dny a zdálo se mi, že všechno funguje, takže jsem nereagoval.

Pokud chceš jen doplnit počet zadaných sekund, tak by mělo stačit odkomentovat var k a dát místo zakomentované podmínky:
if (!k) {
  k = c;
  document.fm.zadano.value = "Bylo zadáno: " + k + " sekund";
}
_es
Profil
Joan:
Skús si na JS zohnať nejakú literatúru.
To je, ako keby sa niekto snažil opraviť nejaký zložitý stroj tak, že začne bezhlavo premiestňovať súčiastky na iné miesta.
Čo som vytušil, tak potrebuješ asi niečo takéto:
var sek = document.getElementById("sekundy"), zad = document.getElementById("zadano");
sek.onkeyup = sek.onmouseup = sek.onchange = function(){ zad.value = "Bylo zadáno: " + this.value + " sekund"; };
Joan
Profil
Davex:
Tak opravdu tam má být jedno rovnítko, už mi to funguje jak chci! Musela jsem mimo jiné proměnnou "k" přesunout vně fukce, tj. ne jako lokální, ale jako globální.
Joan
Profil
_es:
Skús si na JS zohnať nejakú literatúru.
Věř mi, že mám dvě dobré knížky, tahám je s sebou do práce každý den a louskám v tramvaji, ale holt zatím nemám to správné programátorské myšlení jako třeba Ty. Ale nevzdávám to :-)
_es
Profil
Joan:
Po dokončení odpočítavania nejde odpočítavanie znovu spustiť.
Až po stlačení "zastav", čo nie je veľmi logické - vo Firefoxe.
Možno za to môže tá neošetrená chyba: document.zvuk is undefined
Joan
Profil
_es:
Přesně tak, Firefox ani Opera zřejmě neznají "document.zvuk.play();", pouze Internet Explorer (od IE6 nahoru určitě). Zastavení skriptu (nebo F5) skutečně znovurozběhne skript, chová se to totožně v Mozille, Opeře i IE. Ale protože tento skript bude sloužit především mně, tak já o tom vím a spouštím ho výhradně v IE. Tuto chybu ošetří snad jen instalace doplňku Apple QuickTime , který mi ale totálně rozhodil asociace souborů, tak letěl okamžitě zase pryč. Ale jsem ráda, že jsem sesmolila skript, který mi plně dostačuje.
Joan
Profil
Ještě bych chtěla ve skriptu nastavit, aby hodnota proměnné k byla zobrazena tučně, tj.
document.fm.zadano.value = "Bylo zadáno: "+k+ " sekund";  

tak jsem nastavila
document.fm.zadano.value = "Bylo zadáno: "+k.bold()+ " sekund";  

Něco jsem o formátování proměnných našla tady, ale překvapilo mě, že mi to nefunguje, konzola hlásí k.bold is not a function.
Přitom např. pokusné
var veta = "Zkusím tučné písmo";
document.write("Pokus: "+veta.bold());
zobrazuje správně tučné písmo. Proč u document.write (které samozřejmě použít nemohu) to funguje, ale u value v inputu ne?
__construct
Profil
Joan:
Veď v tom odkaze máš písané, že to sú metódy objektu String; Ty máš v premennej k asi integer number a okrem toho tá metóda Ti iba obalí reťazec do tagu <b> čiže by si v inpute mala napr: Bylo zadáno: <b>15</b> sekund
//edit:
Súhlasím s pantherom - ten input tam je zbytočný. Daj namiesto neho napr. span s id=zadano a do CSS doplň:
#zadano {
 background:none repeat scroll 0 0 white;
 border:1px solid #7F9DB9;
 margin-top:2em;
 padding:0.2em;
 text-align:center
}
panther
Profil
Joan:
v inputu nelze text formátovat. Pokud chceš tučné písmo, zvážil bych, zda tam opravdu potřebuješ input, nebo jen něco, co by tak mohlo vypadat. Jaký význam ten input má? Předpokládám, že žádný :-)
Joan
Profil
panther:
"v inputu nelze text formátovat"
Ale zeleně orámované políčko, do kterého vpisuji čas k odečítání modrým písmem, je input :-)

Akorát je formátovaný stylem už při natažení stránky. Já jsem si představovala, že bude tučně pouze proměnná k, která jenom zachytí vepsaný čas, nikoliv celý text "Bylo zadáno: xxx sekund"
Bohužel tohle je jen kosmetická úprava, narazila jsem na funkční chybku: celý skript správně funguje jenom po prvním otevření stránky. Podruhé až po Ctrl+F5 (samotné F5 kupodivu nestačí). Takže napřed budu muset vyřešit současnou ne-reprodukovatelnost skriptu.
panther
Profil
Joan:
Ale zeleně orámované políčko, do kterého vpisuji čas k odečítání modrým písmem, je input :-)
to ano. Špatně jsem se vyjádřil.

Vnitřek i vnějšek inputu lze stylovat, ale nejde formátovat pomocí HTML tagů, tedy <b> tam nedostaneš. Jestli trváš na tom, že počet sekund má být tučně, použij místo inputu něco jiného (třeba odstavec).
Joan
Profil
Tak jsem to dokázala :-)

- mám barevně formátovaný obsah informačního políčka s id="zadano" (dá se bez toho žít, ale tak jednoduchý úkol jsem nechtěla vzdát)
- díky mému nápadu
function spust()
{
if(!zapnuto)
  {
  zapnuto = 1;
  t = setTimeout(pocitej, 1000);
  zapnuto = 0;
  }
}


lze časování spouštět opakovaně BEZ klikání na tlačítko Zastav
- z cvičných důvodů jsem přiřazovací podmínkou odlišila české skloňování sekundy vs. sekund

S čím zatím zápolím je, aby se po proběhnutí časování vymazal obsah proměnné k, čili aby se s novým spuštěním skriptu vepsala do informačního políčka nová správná hodnota zadaného času.
c = parseInt(document.fm.sekundy.value);         
     if(!k)
     {
     k = c;
     var sek = (k <= 4) ? "sekundy" : "sekund";
     document.getElementById("zadano").innerHTML = "<div id='cas'>Bylo zadáno: <span>" +k+ " </span>" +sek+ "</div>"; 
     //delete k;
     }  

ale proměnnou asi nelze jen tak jednoduše smazat, že?
panther
Profil
Joan:
ale proměnnou asi nelze jen tak jednoduše smazat, že?
za jistých okolností by to jít mělo.
Davex
Profil
Joan:
Když se nad tím skriptem zamyslím, tak mě napadá, že by se vlastně kód ze začátku funkce pocitej() dal přesunout do funkce spust(), protože je potřeba jen při stisknutí tlačítka spusť a proměnná k s podmínkou pak nebude vůbec potřeba.
Joan
Profil
Davex:
"a proměnná k s podmínkou pak nebude vůbec potřeba"
No ale jak potom odliším proměnnou c, která má za úkol se odečítat a proměnnou k, která pouze zachytí zadané sekundy předané proměnnou c a staticky se zobrazuje v nejhornějším políčku?
Keeehi
Profil
Nějak se v tom tvém kódu nemohu vyznat, proto jsem ho celý přepsal. Tento kód funguje opakovaně i bez refereshe. Omlouvám se za IDčka, ale nějak mě nenapadla vhodná pojmenování.

<span id="a"></span>
<span id="b"></span>
<input type="text" id="zadani">
<span id="ovladani"><a href="#" onclick="spustit();">Spustit</a></span>
<a href="#" onclick="zastavit();">Zastavit</a>

<script type="text/javascript">
<!--
var cas;
var budik;

function spustit(){
  cas=document.getElementById("zadani").value;
  document.getElementById("a").innerHTML="Konec za "+cas+" sekund.";
  document.getElementById("b").innerHTML="Bylo zadáno "+cas+" sekund.";
  document.getElementById("ovladani").innerHTML="<a href=\"#\" onclick=\"pozastavit();\">Pozastavit</a>";
  cas--;
  budik=window.setInterval("odpocitavani()",1000);
}

function pozastavit(){
  window.clearInterval(budik);
  document.getElementById("ovladani").innerHTML="<a href=\"#\" onclick=\"pokracovat();\">Pokračovat</a>";
}

function pokracovat(){
  budik=window.setInterval("odpocitavani()",1000);
  document.getElementById("ovladani").innerHTML="<a href=\"#\" onclick=\"pozastavit();\">Pozastavit</a>";
}

function zastavit(){
  window.clearInterval(budik);
  document.getElementById("ovladani").innerHTML="<a href=\"#\" onclick=\"spustit();\">Spustit</a>";
  document.getElementById("a").innerHTML="";
  document.getElementById("b").innerHTML="";
}

function odpocitavani(){
  if(cas<=0){
    window.clearInterval(budik);
    document.getElementById("a").innerHTML="Odpočítávání dokončeno.";
    // akce co se mají provést po dokončení odpočítávání
    alert('baf');
  }
  else{
  document.getElementById("a").innerHTML="Konec za "+cas+" sekund.";
  }
  cas--;
}
//-->
</script>
Joan
Profil
Keeehi:
Děkuju Ti! Natáhla jsem si Tvůj kód do svého malého Asuse a vyzkoušela. Je pravda, že Tvůj kód funguje, jak potřebuji. Místo F5 se musí použít funkce Zastavit, aby se skript resetoval, ale to nevadí.
Já jsem měla ve skriptu setTimeout (protože to tak napsali první rádci), Ty používáš setInterval. Kolikrát bych podle své "logiky" zvolila ten druhý, než znalec použil a ono by to fakt nefungovalo správně. Je prosím Tě nějaká univerzální a nevyvratitelná rada, kdy použít setInterval a kdy setTimeout? A hlavně proč ten který?
Díky!

EDIT: Tak jsem se s tím poprala a zjistila jsem velezásadní věc:
- ve Tvém skriptu se časová hodnota zadává do inputu (jinam to ani nejde), ale oproti mému původnímu řešení to počítá jinde, takže odpadá problém s přenosem proměnné do místa, kde se má staticky zobrazovat. To je bezvadné řešení, tím jsi mi moc pomohl.
Já jsem si Tvůj skript poněkud oškubala, protože přerušení běhu skriptu při tomto konkrétním použití neuživím (voda bude vařit furt, bez ohledu na skript), takže i v tomto případě se musí kliknout napřed "Zastav", aby se mohlo počítat odznova. Jinými slovy: potřebovala bych skriptu nějak říct, že dojetí až na nulu se má chovat stejně jako stisknutí tlačítka "Zastav".
Taky jsem si všimla, že pokud odklepnu prázdné políčko, tak se začne počítat do mínusu - toto zase můj původní skript nedělá a zarazí se. Jo a běhá to se zvukem jenom v IE, v ostatních prohlížečích mi vyskakoval problém s nepřehráváním (Firefox) nebo naopak s automatických přehráním hned po onloadu (Opera).
Nicméně jsem zase o chloupek chytřejší, jen bych velmi potřebovala víc osvětlit, kdy a proč použít setInterval a kdy zase setTimeout.
Keeehi
Profil
Joan:
pokud odklepnu prázdné políčko, tak se začne počítat do mínusu
Můj taky ne, ty jsi ho však změnila.
Já mám:
if(cas<=0)
Ty jsi napsala
if(cas==0)
A to je rozdíl.

dojetí až na nulu se má chovat stejně jako stisknutí tlačítka "Zastav".
Není problém v tu chvíli zavolat funkci zastavit.

kdy použít setInterval a kdy setTimeout
Podle toho, co se ti hodí
setTimeout - po zadané době, jednou provede danou akci
setInterval - po zadané době provede danou akci potom čeká zadanou dobu a po uplynutí zase provede danou akci a pak zase čeká, provede, čeká, provede, …
Witiko
Profil
Joan:
kdy a proč použít setInterval a kdy zase setTimeout

http://diskuse.jakpsatweb.cz/?action=vthread&forum=8&topic=113256

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: