Autor Zpráva
Vader
Profil
Mám problém, neviem ako zostaviť script, ktorý keď v option-e zvolím napr. február tak max počet dní sa v druhom optione obmedzí na 28 ale ak zvolím október tak sa obmedzí na 31.
_es
Profil
Vader:
A čo ak bude chcieť návštevník vybrať najprv deň v mesiaci a až potom mesiac?
Vader
Profil
Ak by vybral hodnotu pre deň 31 a zvolil by napr. február (28), tak hodnota den by sa vynulovala na povodne napr <option>Vyber deň</option>
_es
Profil
Vader:
tak hodnota den by sa vynulovala
No, z takýchto samosavynulujúcich ovládacích prvkov by asi návštevník radosť nemal.
Čo ak sa len pomýlil vo výbere a chcel by to opraviť na marec?
Nadbytočné opätovné nastavovanie dňa by ho asi netešilo.
Prečo nespravíš len jednoduchú kontrolu správneho dátumu?
Vader
Profil
To by nebol žiaden problém, ale ja to potrebujem tak ako som už uviedol.
peta
Profil
google = javascript calendar example
Melo by to byt neco jako
<script>
date = new Date();
m  = date.getMonth();
y  = date.getFullYear();
dnu = (new Date(y,m+1,1) - new Date(y,m,1)) / (1000*60*60*24);
alert(dnu);
</script>
Witiko
Profil
peta:
S úlevou vidím, že se takovými prkotinami jako definice proměnných stále nenecháváš omezovat v tvůrčí činnosti. :-)
_es
Profil
Witiko:
Márne rozmýšľam, čo má petov nezmyselný kód spoločné s dotazom, no možno to bude mať efekt, že Vadera prejdú pokusy s vytváraním podobných užívateľsky nepríjemných formulárov.
Witiko
Profil
_es:
Co já jsem vyčetl, tak po zabalení petovo výtvoru do funkce bychom dostali kód, který při zavolání navrátí počet dní v aktuálním měsíci. Něco následujícího:
function početDní(now) {
  now = now || new Date();
  now.setDate(1);
  var then = new Date(now);
  then.setMonth(then.getMonth() + 1); // Tady by se nádherně vyjímalo použití accessorů - then.month++;
  return Math.round((then - now) / 86400000);
};
Jediné čím si nejsem tak jistý je definice nového data s neexistujícím měsícem, viz. new Date(2011, 56, 1) -> 1. 10. 2015. Zdá se, že současné prohlížeče s tím nemají problém, jak jsou na tom starší modely nemám příležitost testovat. Firefox 2.0 mě přesvědčil, že je to snad bezpečné.
_es
Profil
Witiko:
Pri poslednom mesiaci v roku a pri prestupných rokoch by mohli teoreticky nastať problémy.
Počet dní v mesiaci sa dá asi zistiť aj bezpečnejším spôsobom.
peta
Profil
Witiko, _es: OT, vsak oni vam to moderatori jednou spocitaji.
Peta odpovidal na dotaz, jak zjistit pocet dni v mesici. Ano, pravda je, ze script zkolabuje na 12 mesici, kdy vytvori 1.13. - 1.12. To lze ale osetrit podminkou. Pocitam s tim, ze clovek, ktery polozi dotaz ma o programovani jakesi znalosti.
Promenne samozrejme definuji vsude. zde je to hrube opomenuti. Ncmene to funkci scriptu ulozenemu do zvlastniho souboru nijak nenarusi. Opet, sikovny programator uz si to osetri.
Chamurappi
Profil
Reaguji na Witika:
Zdá se, že současné prohlížeče s tím nemají problém, jak jsou na tom starší modely nemám příležitost testovat.
Co já vím, tak s tím neměl nikdy nikdo problém.

Nešlo by to stručněji a bez zdlouhavého dělení milisekund?
function početDní(now) {
  now = now || new Date();
  return new Date(now.getFullYear(), now.getMonth() + 1, 0).getDate();
};


Reaguji na peta:
pravda je, ze script zkolabuje na 12 mesici, kdy vytvori 1.13. - 1.12.
Skutečně zkolabuje?

Opet, sikovny programator uz si to osetri.
Tak si to příště laskavě ošetři, už když to sem píšeš, šikovný programátore. Tohle není otázka dodatečného ladění, tohle jsou základy.
Witiko
Profil
Chamurappi:
, 0)
Pravda. Mělo mě napadnout, že tento jev bude fungovat i v opačném směru. Možná byla chyba vůbec z petovo scriptu vycházet.

peta:
OT, vsak oni vam to moderatori jednou spocitaji.
Dovolil bych si tipovat, že ty poslepované příšernosti, které sem s děsivou pravidelností zasíláš, přitáhnou jejich oči dříve, než mé v zásadě konstruktivní příspěvky. :-)
peta
Profil
Chamurappi:
Ten script vypada zajimave. Pokud vim, tak dny je mozne nastavit 1-31. Jinak jsem vychazel z toho, ze JS takovou funkci nema, jako pocet dni v mesici :)
http://www.w3schools.com/jsref/jsref_obj_date.asp

Witiko:
To math.round je tam zbytecne, protoze rozdil tech dvou cisel by mel byt celociselne delitelny, kdyz jsou h, m a ms nulove.
Chamurappi
Profil
Reaguji na peta:
Pokud vim, tak dny je mozne nastavit 1-31.
Cokoliv mimo rozsah přeteče do okolních měsíců (či roků). Takže nultý den následujícího měsíce je posledním dnem současného.

www.w3schools.com/jsref/jsref_obj_date.asp
Tenhle web je hodně nespolehlivý zdroj informací.

math.round je tam zbytecne
Není. Vyzkoušej si to a uvidíš.
Vader
Profil
Moderátor Chamurappi: Přesunuto z duplicity Datum v JS.

Mám tento script,ale mám menší problém,v JS moc neviem tak sa Vás chcem spýtať:
- Ak si uživateľ najprv vybere deň 30. januára a taký deň v tom mesiaci bude existovať tak nehodí povodnu hodnotu Day,ale ak zvolí najprv 31. februára tak pole day da na povodnu hodnotu, lebo február má len 28 dní.
JS:
<body>
Date Of Birth:
<select name="month" onChange="changeDate(this.options[selectedIndex].value);">
<option value="0">Mesiac:</option>
<option value="01">Január</option>
<option value="02">Február</option>
<option value="03">Marec</option>
<option value="04">Apríl</option>
<option value="05">Máj</option>
<option value="06">Jún</option>
<option value="07">Júl</option>
<option value="08">August</option>
<option value="09">September</option>
<option value="10">Október</option>
<option value="11">November</option>
<option value="12">December</option>
</select>
<select name="day" id="day">
<option value="na">Day</option>
<option value="1">1</option><option value="2">2</option><option value="3">3</option><option value="4">4</option><option value="5">5</option><option value="6">6</option><option value="7">7</option><option value="8">8</option><option value="9">9</option><option value="10">10</option><option value="11">11</option><option value="12">12</option><option value="13">13</option><option value="14">14</option><option value="15">15</option><option value="16">16</option><option value="17">17</option><option value="18">18</option><option value="19">19</option><option value="20">20</option><option value="21">21</option><option value="22">22</option><option value="23">23</option><option value="24">24</option><option value="25">25</option><option value="26">26</option><option value="27">27</option><option value="28">28</option><option value="29">29</option><option value="30">30</option><option value="31">31</option>
</select>
<select name="year" id="year">
<option value="na">Year</option>
</select>
<script language="JavaScript" type="text/javascript">
function changeDate(i){
var e = document.getElementById('day');
while(e.length>0)
e.remove(e.length-1);
var j=-1;
if(i=="na")
k=0;
else if(i==2)
k=28;
else if(i==4||i==6||i==9||i==11)
k=30;
else
k=31;
while(j++<k){
var s=document.createElement('option');
var e=document.getElementById('day');
if(j==0){
s.text="Day";
s.value="na";
try{
e.add(s,null);}
catch(ex){
e.add(s);}}
else{
s.text=j;
s.value=j;
try{
e.add(s,null);}
catch(ex){
e.add(s);}}}}
y = 1997;
while (y-->1906){
var s = document.createElement('option');
var e = document.getElementById('year');
s.text=y;
s.value=y;
try{
e.add(s,null);}
catch(ex){
e.add(s);}}
</script>
</body>
</html>
etexweb
Profil
Moderátor Chamurappi: Přesunuto z duplicity Datum v JS.

Napadá ma riešenie v PHP:
<?php
$monthOptions = '';
$dayOptions = '';
$yearOptions = '';
 
for($month=1; $month<=12; $month++)
{
    $monthName = date("M", mktime(0, 0, 0, $month));
    $monthOptions .= "<option value=\"{$month}\">{$monthName}</option>\n";
}
for($day=1; $day<=31; $day++)
{
    $dayOptions .= "<option value=\"{$day}\">{$day}</option>\n";
}
for($year=1900; $year<=2010; $year++)
{
    $yearOptions .= "<option value=\"{$year}\">{$year}</option>\n";
}
?>
<html>
<head>
<script type="text/javascript">

function updateDays()
{
    //Create variables needed
    var monthSel = document.getElementById('month');
    var daySel   = document.getElementById('day');
    var yearSel  = document.getElementById('year');
    var monthVal = monthSel.value;
    var yearVal  = yearSel.value;
    
    //Determine the number of days in the month/year
    var daysInMonth = 31;
    if (monthVal==2)
    {
        daysInMonth = (yearVal%4==0 && (yearVal%100!=0 || yearVal%400==0)) ? 29 : 28;
    }
    else if (monthVal==4 || monthVal==6 || monthVal==9 || monthVal==11)
    {
        daysInMonth = 30;
    }
    
    //Add/remove options from days select list as needed
    if(daySel.options.length > daysInMonth)
    {   //Remove excess days, if needed
        daySel.options.length = daysInMonth;
    }
    while (daySel.options.length != daysInMonth)
    {   //Add additional days, if needed
        daySel.options[daySel.length] = new Option(daySel.length+1, daySel.length+1, false);
    }
    
    return;
}

</script>
</head>
<body>
Birthdate:<br />
<select name="month" id="month" onchange="updateDays();">
<?php echo $monthOptions; ?>
</select>

<select name="day" id="day">
<?php echo $dayOptions; ?>
</select>

<select name="year" id="year" onchange="updateDays();">
<?php echo $yearOptions; ?>
</select>

</body>
</html>

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