Autor Zpráva
maycza
Profil
Zdravím všechny,

mám vytvořenou funkci, která má za úkol kontrolovat, zda je v inputu zapsán datum ve správném formátu. Datum musí být zadáno ve formátu dd.mm.rrrr. Nejdřív zadanou hodnotu rozdělím na 3 části a pak kontroluji znaky v každé části, tedy jestli jsou zadány čísla od 0 do 9, pak kontroluju rozsah zadaných hodnot, atd. Kontrolu znaků dělám takto:

function check_date(field){ 
var re = /^[0-9]$/;
var ok = 0;

var result="den: ";
  for (i=0;i<den.length;i++){
    if (!re.test(den[i])){ok=1;}
  }  
  result = result + " mesic:";
  for (i=0;i<mesic.length;i++){
    if (!re.test(mesic[i])){ok=1;}
  }
  
  result = result + " rok:";
  for (i=0;i<rok.length;i++){
    if (!re.test(rok[i])){ok=1;}
  }
  alert("výsledek: " + result);
}

V html mám:
<input type='text' name='datum' onblur="check_date(this);">

Když to spustím v Google Chrome a zadám např. "14.1.2013", vrátí mi to ok=0, v IE 8 (v kompatibilním režimu) ok=1

Nevíte někdo v čem je problém?
_es
Profil
maycza:
Skús použiť udalosť onchange.
Chamurappi
Profil
Reaguji na mayczu:
Co je v proměnných den, mesic a rok? Jestli řetězec, tak z něj ždímat nejde spolehlivě tahat znaky přes indexy, musíš použít metodu charAt. Ale k tomu bys asi neměl důvod, když můžeš otestovat regulárním výrazem i víc znaků zároveň.

Mimochodem, celá ta funkce je docela zvláštní.
maycza
Profil
_es:
kdepak, tím to není..

Ještě se dívám.. tu proměnnou result si odmyslete O:-) tam jsem jenom připisoval výsledek každé podmínky, abych viděl jednotlivé kroky... (v IE samé chyby, ať jsem zadal cokoliv, v Chrome OK)


Chamurappi:

den, mesic a rok jsou řetězce..

Radši sem dám celou funkci, ať to je líp vidět:

function check_date(field){ 
  var datum;
  var den;
  var mesic;
  var rok; 
  var dateField = field;
  var re = /^[0-9]$/;
 
  datum = dateField.value;

  rozdel=datum.split(".");
  
  if ((rozdel.length<3)||(rozdel.length>3)){
    if (rozdel.length==1){
      pomm=rozdel[0];
      if (pomm.length>0){alert ("Chybně zadané datum!!!");}
    }else{alert ("Chybně zadané datum!!!");}  
  }else{
  
  
  den=rozdel[0];
  mesic=rozdel[1];
  rok=rozdel[2];

  var ok=0;

  for (i=0;i<den.length;i++){
    if (!re.test(den[i])){ok=1;}
  }  

  for (i=0;i<mesic.length;i++){
    if (!re.test(mesic[i])){ok=1;}
  }
  
   for (i=0;i<rok.length;i++){
    if (!re.test(rok[i])){ok=1;}
  }

if (ok==0){
  
  if (((mesic.length==1)||(mesic.length==2))&&((den.length==1)||(den.length==2))&&(rok.length==4)){
  
  if ((mesic<1)||(mesic>12)){alert("Chybně zadané datum!!!");}
  else{
    if (mesic==2){
      if((den<1)||(den>29)){alert("Chybně zadané datum!!!");}
    }else{
      if((den<1)||(den>31)){alert("Chybně zadané datum!!!");}
    }  
  }
  if ((rok<2011)||(rok>2112)){alert("Chybně zadané datum!!!");} 
    
  }else{alert("Chybně zadané datum!!!");}
  
  }else{
    alert("Chybně zadané datum!!!");
  }
  }
  
}
_es
Profil
maycza:
Príčinu nekompatibility máš v [#3]. Na overenie existujúceho dátumu nepotrebuješ hentakú zložitú funkciu. JS má na prácu s dátumom a časom vlastné metódy: Date.
maycza
Profil
Díky za rady, budu to muset ještě nastudovat..

Prozatím jsem to vyřešil změnou výrazu na
var re = /[0-9]{0,1}[0-9]{1}(.)[0-9]{0,1}[0-9]{1}(.)[0-9]{1}[0-9]{1}[0-9]{1}[0-9]{1}/;
takže nedělám kontrolu pro každý znak, jenom mi dál zůstává kontrola jestli jsou dny v rozmezí 1-31, měsíce 1-12...

Časem to snad doladím :D
_es
Profil
maycza:
function overenieDatumu(den, mesiac, rok){
  var d = new Date(rok, mesiac - 1, den);
  return d.getDate() == den && d.getMonth() == mesiac - 1 && d.getFullYear() == rok;
}

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: