Avatar billede -thomas- Nybegynder
24. juli 2003 - 14:28 Der er 24 kommentarer og
1 løsning

Forskel i dato

Jeg har lige et enkelt script til:

Jeg har to dato-felter i en formular, som skal udfyldes. Kan et javascript tjekke om den ene dato er senere end eller lig den anden og i modsat fald komme med en fejlmeddelelse? Datoerne er begge i formatet dd-mm-yyyy.
Avatar billede -thomas- Nybegynder
24. juli 2003 - 16:19 #1
Prøver at sætte pointene op - er det ingen der kan hjælpe med dette???
Avatar billede Slettet bruger
24. juli 2003 - 17:43 #2
Det er noget af en smøre:

<html>
<head>
<script type="text/javascript">
function tjekDatoer(frm) {
  st = frm.start.value;
  sl = frm.slut.value;
  if (!st.match(/\d{2}\/\d{2}-\d{4}/)) {
    alert("Startdatoen er ikke korrekt.");
    return false;
  }
  if (!sl.match(/\d{2}\/\d{2}-\d{4}/)) {
    alert("Slutdatoen er ikke korrekt.");
    return false;
  }
  std = new Date(parseInt(st.split("-")[1], 10), parseInt(st.split("/")[1].split("-")[0], 10) - 1, parseInt(st.split("/")[0], 10));
  if (std.getDate() != parseInt(st.split("/")[0], 10) || std.getMonth() + 1 != parseInt(st.split("/")[1].split("-")[0], 10) || std.getFullYear() != parseInt(st.split("-")[1], 10)) {
    alert("Startdatoen er ikke en gyldig dato!");
    return false;
  }
  sld = new Date(parseInt(sl.split("-")[1], 10), parseInt(sl.split("/")[1].split("-")[0], 10) - 1, parseInt(sl.split("/")[0], 10));
  if (sld.getDate() != parseInt(sl.split("/")[0], 10) || sld.getMonth() + 1 != parseInt(sl.split("/")[1].split("-")[0], 10) || sld.getFullYear() != parseInt(sl.split("-")[1], 10)) {
    alert("Slutdatoen er ikke en gyldig dato!");
    return false;
  }
  if (std.getTime() >= sld.getTime()) {
    alert("Startdatoen skal være før slutdatoen.");
    return false;
  }
  return true;
}
</script>
</head>
<body>
<form onSubmit="return tjekDatoer(this);">
Start: <input type="text" name="start" value="dd/mm-åååå" size="10" /><br />
Slut: <input type="text" name="slut" value="dd/mm-åååå" size="10" /> <input type="submit" value="OK" />
</form>
</body>
</html>
Avatar billede -thomas- Nybegynder
24. juli 2003 - 17:50 #3
Det ser jo rigtig fint ud, men kan du lave et par ændringer (det vil nok gøre det en del kortere), så skal du nok få point:
- den behøver ikke tjekke dato-formatet.
- datoformatet skal være dd-mm-yyyy istedet for dd/mm-yyyy
- den må gerne submitte hvis datoerne er ens.

På forhånd tak for hjælpen
Avatar billede Slettet bruger
24. juli 2003 - 17:54 #4
Hvorfor skal den ikke tjekke dato-formatet? Det kan jo ødelægge beregningen. Nå:

<html>
<head>
<script type="text/javascript">
function tjekDatoer(frm) {
  st = frm.start.value;
  sl = frm.slut.value;
  std = new Date(parseInt(st.split("-")[2], 10), parseInt(st.split("-")[1], 10) - 1, parseInt(st.split("-")[0], 10));
  if (std.getDate() != parseInt(st.split("-")[0], 10) || std.getMonth() + 1 != parseInt(st.split("-")[1], 10) || std.getFullYear() != parseInt(st.split("-")[2], 10)) {
    alert("Startdatoen er ikke en gyldig dato!");
    return false;
  }
  sld = new Date(parseInt(sl.split("-")[2], 10), parseInt(sl.split("-")[1], 10) - 1, parseInt(sl.split("-")[0], 10));
  if (sld.getDate() != parseInt(sl.split("-")[0], 10) || sld.getMonth() + 1 != parseInt(sl.split("-")[1], 10) || sld.getFullYear() != parseInt(sl.split("-")[2], 10)) {
    alert("Slutdatoen er ikke en gyldig dato!");
    return false;
  }
  if (std.getTime() > sld.getTime()) {
    alert("Startdatoen skal være før slutdatoen.");
    return false;
  }
  return true;
}
</script>
</head>
<body>
<form onSubmit="return tjekDatoer(this);">
Start: <input type="text" name="start" value="dd-mm-åååå" size="10" /><br />
Slut: <input type="text" name="slut" value="dd-mm-åååå" size="10" /> <input type="submit" value="OK" />
</form>
</body>
</html>
Avatar billede Slettet bruger
24. juli 2003 - 17:55 #5
Og hvis du heller ikke vil teste datoernes gyldighed:

<script type="text/javascript">
function tjekDatoer(frm) {
  st = frm.start.value;
  sl = frm.slut.value;
  std = new Date(parseInt(st.split("-")[2], 10), parseInt(st.split("-")[1], 10) - 1, parseInt(st.split("-")[0], 10));
  sld = new Date(parseInt(sl.split("-")[2], 10), parseInt(sl.split("-")[1], 10) - 1, parseInt(sl.split("-")[0], 10));
  if (std.getTime() > sld.getTime()) {
    alert("Startdatoen skal være før slutdatoen.");
    return false;
  }
  return true;
}
</script>
Avatar billede -thomas- Nybegynder
24. juli 2003 - 17:56 #6
Perfekt!! Mange tak for hjælpen. Den behøves ikke validere datoen, fordi feltet er readonly med en datovælger ved siden af, så det vil altid være korrekt. Skriv lige et svar, så du kan få dine point.
Avatar billede Slettet bruger
24. juli 2003 - 17:58 #7
Ok, på den måde. :)
Avatar billede -thomas- Nybegynder
24. juli 2003 - 18:03 #8
Hmm...jeg har i forvejen en onsubmit="return validate(this); i min form - kan man sætte den til at udføre begge funktioner?
Avatar billede erikjacobsen Ekspert
24. juli 2003 - 18:13 #9
Det samme - en kende kortere:

<script type="text/javascript">
function tjekDatoer(frm) {
  st = frm.start.value;
  sl = frm.slut.value;
  std = new Date(parseInt(st.split("-")[2], 10), parseInt(st.split("-")[1], 10) - 1, parseInt(st.split("-")[0], 10));
  sld = new Date(parseInt(sl.split("-")[2], 10), parseInt(sl.split("-")[1], 10) - 1, parseInt(sl.split("-")[0], 10));
  if (std.getTime() > sld.getTime()) {
    alert("Startdatoen skal være før slutdatoen.");
    return false;
  }
  return true;
}
</script>


Du kan bare lave en funktion, der kalder begge:

  funktion valid(frm) {
    if (!validate(frm)) return false;
    if (!tjekDatoer(frm)) return false;
    return true;
  }

og bruge den i onsubmit
Avatar billede erikjacobsen Ekspert
24. juli 2003 - 18:14 #10
Hovsa - forkert indsat. Det er denne der er kortere:

<script type="text/javascript">
function tjekDatoer(frm) {
  st = frm.start.value.split('-');
  sl = frm.slut.value.split('-');
  std = new Date(st[2],st[1]-1,st[0]);
  sld = new Date(sl[2],sl[1]-1,sl[0]);
  if (std.getTime() > sld.getTime()) {
    alert("Startdatoen skal være før slutdatoen.");
    return false;
  }
  return true;
}
</script>
Avatar billede -thomas- Nybegynder
24. juli 2003 - 18:25 #11
Funktionen der kalder begge kan jeg ikke rigtig få til at virke - den kalder ikke nogen af dem. Er den rigtig som du har skrevet den?
Avatar billede -thomas- Nybegynder
24. juli 2003 - 18:30 #12
Opretter det lige i et spørgsmål for sig...
Avatar billede erikjacobsen Ekspert
24. juli 2003 - 18:37 #13
Den er utestet - får du en javascriptfejl? Og hvad skriver
du helt præcist?
Avatar billede -thomas- Nybegynder
24. juli 2003 - 18:40 #14
Nej ingen javascriptfejl, men hvis den første funktion giver return.true vil den slet ikke submittes uanset den anden funktion.
Avatar billede -thomas- Nybegynder
24. juli 2003 - 18:41 #15
Hvis begge funktioner giver return true burde formen jo submittes.
Avatar billede erikjacobsen Ekspert
24. juli 2003 - 18:45 #16
Hvad skriver du?
Avatar billede -thomas- Nybegynder
24. juli 2003 - 18:54 #17
Det er som om den aldrig når til andet script - jeg har skrevet følgende:

<html>
<body>

<SCRIPT LANGUAGE="JavaScript" type='text/javascript'>
function tjekDatoer(frm) {
  st = frm.start.value.split('-');
  sl = frm.slut.value.split('-');
  std = new Date(st[2],st[1]-1,st[0]);
  sld = new Date(sl[2],sl[1]-1,sl[0]);
  if (std.getTime() > sld.getTime()) {
    alert("Startdatoen skal være før slutdatoen.");
    return false;
  }
  return true;
}
</SCRIPT>


<SCRIPT LANGUAGE="JavaScript" type='text/javascript'>
function validate(objForm){
    var errorMessage = "";
    var firstError = "";
    for (var i=0;i<objForm.length;i++){
        switch(objForm[i].type){
            case "text":
                if (objForm[i].required && !objForm[i].value){
                    errorMessage += objForm[i].feltnavn + "\n";
                    if (!firstError)
                        firstError = objForm[i];
                }
            break;
        }
    }
    if (errorMessage){
        alert("Du har ikke udfyldt følgende felter:\n\n" + errorMessage);
        firstError.focus();
        return false;
    }
}
</SCRIPT>



<SCRIPT LANGUAGE="JavaScript" type='text/javascript'>
  function valid(frm) {
    if (!validate(frm)) return false;
    if (!tjekDatoer(frm)) return false;
    return true;
  }
</SCRIPT>

<form onSubmit="return valid(this);">
Start: <input type="text" name="start" value="01-10-2002" size="10"><br />
Slut: <input type="text" name="slut" value="01-01-2002" size="10">
Tekst: <input type="text" required=true feltnavn="test">
<input type="submit" value="OK" />
</form>

</body>
</html>
Avatar billede erikjacobsen Ekspert
24. juli 2003 - 19:02 #18
Din validate er forkert. Du skal returnere true, hvis der ikke er fejl.
Avatar billede erikjacobsen Ekspert
24. juli 2003 - 19:04 #19
PS: Dit "trick" med required=false virker absolut kun i IE.
Det kan ikke anbefales :)
Avatar billede -thomas- Nybegynder
24. juli 2003 - 19:10 #20
Hmm.. det var en anden på Eksperten der lavede den til mig. Nogen ide til hvordan jeg kunne skrive dette rigtig så? Kan stadig ikke få det til at virke. Hvor skal jeg sætte return true?
Avatar billede erikjacobsen Ekspert
24. juli 2003 - 19:22 #21
Det med required? Du kunne jo bare teste dem, der skal være
der, direkte.

return true;  som det allersidste i funktionen.
Avatar billede -thomas- Nybegynder
24. juli 2003 - 19:27 #22
Så ser det ud til at virke. Tak for det.

Mht. required var det netop for at undgå at skulle angive hvilke felter der skulle tjekkes. Ville det hjælpe, hvis man bruge alt-attributten f.eks.?
Avatar billede erikjacobsen Ekspert
24. juli 2003 - 19:33 #23
Jeg ville måske bare lave lidt navnemagi. Fx

  name="o_navn"  hvis det er optional
  name="r_navn"  hvis det er required

Og ellers, ja, så ville jeg tage felterne ét for ét. Det er
selvfølgelig OK at checke om der står noget eller ej, men
tit skal du alligevel lave et individuelt check på nogle
af felterne. Og endelig er det noget der ligesågodt kan
genereres fra serveren ud fra nogle specifikationer dér... men
det er en længere historie (som Microsoft sikkert har
taget patent på *gg*)
Avatar billede -thomas- Nybegynder
24. juli 2003 - 19:37 #24
Hehe, ja men tak for hjælpen. Skriv et svar her: http://www.eksperten.dk/spm/379500 så skal du få pointene...
Avatar billede erikjacobsen Ekspert
24. juli 2003 - 19:39 #25
Skidt med point - altid en fornøjelse at hjælpe.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester