Avatar billede submitt Nybegynder
28. april 2006 - 11:45 Der er 21 kommentarer og
1 løsning

Dato større end 90 dage fra dags dato

Jeg har en formular med et text-field hvor brugeren skal indtaste en dato i formatet dd-mm-yyyy. Derudover har jeg en check-boks. Såfremt brugeren har sat "flueben" i checkboksen skal følgende regel være gældende for dato-feltet: Den indtastede dato skal være MERE end 90 dage fra dags dato (ud i fremtiden) og formularens data må ikke sendes før før dette udsagn er rigtigt.Hvis den indtastede dato er MINDRE end 90 dage fra dags dato skal der komme en fejlmeddelelse.


Ovenstående er sikkert ikke så svært, MEN problemet er at jeg allerede kalder et validerings-javascript fra min Submitknap. Det er et JavaScript som Dreamweaver har lavet. Jeg vil selvfølgelig gerne have ovenstående dato-validering ind i mit eksisterende valideringsscript.

Herunder koderne:

Nuværende validerings-script:

function MM_validateForm() { //v4.0
  var i,p,q,nm,test,num,min,max,errors='',args=MM_validateForm.arguments;
  for (i=0; i<(args.length-2); i+=3) { test=args[i+2]; val=MM_findObj(args[i]);
    if (val) { nm=val.name; if ((val=val.value)!="") {
      if (test.indexOf('isEmail')!=-1) { p=val.indexOf('@');
        if (p<1 || p==(val.length-1)) errors+='- '+nm+' skal indeholde en korrekt e-mailadresse.\n';
      } else if (test!='R') { num = parseFloat(val);
        if (isNaN(val)) errors+='- '+nm+' kan kun indeholde tal.\n';
        if (test.indexOf('inRange') != -1) { p=test.indexOf(':');
          min=test.substring(8,p); max=test.substring(p+1);
          if (num<min || max<num) errors+='- '+nm+' must contain a number between '+min+' and '+max+'.\n';
    } } } else if (test.charAt(0) == 'R') errors += '- '+nm+' skal udfyldes.\n'; }
  } if (errors) alert('Følgende fejl opstod:\n'+errors);
  document.MM_returnValue = (errors == '');
}


Nuværende kode på Submit-knappen:

<input type="submit" onClick="MM_validateForm('startdato','','R','slutdato','','R','arrangoer','','R','aktivitet','','R','disciplin','','R','stedAdresse','','R','stedPostnummer','','NisNum','stedBy','','R','tilmeldingNavn','','R','tilmeldingTelefon','','NisNum','tilmeldingMobil','','NisNum','tilmeldingEmail','','NisEmail','tidspunkter','','R','indskud','','R');return document.MM_returnValue" value="OK - Opret">



Nogen der kan hjælpe?
Avatar billede submitt Nybegynder
28. april 2006 - 11:47 #1
PS - har lagt en gif ud på følgende adresse der viser problematikken:

http://home10.inet.tele.dk/falcken/form.gif
Avatar billede horsmark Nybegynder
28. april 2006 - 20:05 #2
måske det er en god idé _ikke_ at lade dreamweaver bygge scriptet så ;-)
Avatar billede submitt Nybegynder
28. april 2006 - 21:11 #3
Ja - men nu er det jo ligesom gjort ... Kan du hjælpe?
Avatar billede horsmark Nybegynder
29. april 2006 - 07:55 #4
post lige din form så kigger jeg på det
Avatar billede submitt Nybegynder
30. april 2006 - 13:11 #5
Lyder skide godt! :-)

Formen er ret stor. Jeg har renset den for alt hvad der hedder tabelkoder m.m. Jeg ved ikke hvor pænt koden kommer til at stå når jeg indtaster den her, men hvis du synes den er for uoverskuelig kan jeg evt. maile den til dig.

Iøvrigt: Det er feltet STARTDATO der skal være 90 dage større end dags dato, såfremt der er flueben i checkboksen AKTIVITET_NAALE.

Og her er så koden:

<form method="post" action="<%=MM_editAction%>" name="form1">
<p>Hvilken dato starter aktiviteten?</p>
<input type="text" name="startdato" value="" size="16" onblur="check_date(this)">(dd-mm-&aring;&aring;&aring;&aring;)
<p>Hvilken dato slutter aktiviteten?</p>
<input type="text" name="slutdato" value="" size="16" onblur="check_date(this)">dd-mm-&aring;&aring;&aring;&aring;)
<p>Hvem er arrang&oslash;r?</p>
<input name="arrangoer" type="text" value="" size="50" maxlength="50">
<p>Navn p&aring; aktivitet:</p>
<input name="aktivitet" type="text" value="" size="50" maxlength="70">
<p>Disciplin:</p>
<input name="disciplin" type="text" value="" size="50" maxlength="70">
<p>Aktivitet (v&aelig;lg):</p>
<p>Gev&aelig;r</p>
<input type="checkbox" name="aktivitet_gevaer" value=1 >
<p>Pistol</p>
<input type="checkbox" name="aktivitet_pistol" value=1 >
<p>Terr&aelig;n</p>
<input type="checkbox" name="aktivitet_terraen" value=1 >
<p>N&aring;leskydning</p>
<input type="checkbox" name="aktivitet_naale" value=1 >
<p>Kursus</p>
<input type="checkbox" name="aktivitet_kursus" value=1 >
<p>M&oslash;de</p>
<input type="checkbox" name="aktivitet_moede" value=1 >
<p>Hvor afholdes aktiviteten? (Sted)</p>
<input name="stedSted" type="text" id="stedSted" value="" size="50" maxlength="50">
<p>Hvor afholdes aktiviteten? (Adresse)</p>
<input name="stedAdresse" type="text" value="" size="50" maxlength="50">
<p>Hvor afholdes aktiviteten? (Postnr. og by)</p>
<input name="stedPostnummer" type="text" value="" size="6" maxlength="4">         
<input name="stedBy" type="text" value="" size="37" maxlength="37">
<p>Tidspunkter (maks. 75 karakterer):</p>
<textarea name="tidspunkter" cols="50" rows="3" onKeyUp="java script:restwtidspunkter()" style="overflow:hidden"></textarea>
<input name="rest1" id="rest12" style="font-weight:bold;color:red;" value="0" size="2" readonly>
<p>Indskud(maks. 75 karakterer):</p>
<textarea name="indskud" cols="50" rows="3" onKeyUp="java script:restwindskud()" style="overflow:hidden"></textarea>
<input name="rest2" id="rest23" style="font-weight:bold;color:red;" value="0" size="2" readonly>
<p>Navn p&aring; den person man kan tilmelde sig hos (den tilmeldingsansvarlige):</p>
<input name="tilmeldingNavn" type="text" id="tilmeldingNavn" size="50" maxlength="40">
<p>Telefonnummer p&aring; den tilmeldingsansvarlige:</p>
<input name="tilmeldingTelefon" type="text" id="tilmeldingTelefon" size="16" maxlength="8">
<p>Mobiltelefonnummer p&aring; den tilmeldingsansvarlige:</p>
<input name="tilmeldingMobil" type="text" id="tilmeldingMobil" size="16" maxlength="8">
<p>E-mailadresse p&aring; den tilmeldingsansvarlige:</p>
<input name="tilmeldingEmail" type="text" id="tilmeldingEmail" size="50" maxlength="50">
<p>Hjemmeside:</p>
<input type="text" name="website" value="http://" size="32">
<p>Yderligere (maks. 75 karakterer):</p>
<textarea name="yderligere" cols="50" rows="3" onKeyUp="java script:restwyderligere()" style="overflow:hidden"></textarea>
<input name="rest4" id="rest43" style="font-weight:bold;color:red;" value="0" size="2" readonly><input type="submit" onClick="MM_validateForm('startdato','','R','slutdato','','R','arrangoer','','R','aktivitet','','R','disciplin','','R','stedAdresse','','R','stedPostnummer','','NisNum','stedBy','','R','tilmeldingNavn','','R','tilmeldingTelefon','','NisNum','tilmeldingMobil','','NisNum','tilmeldingEmail','','NisEmail','tidspunkter','','R','indskud','','R');return document.MM_returnValue" value="OK - Opret">
<input type="hidden" name="MM_insert" value="form1">
</form>
Avatar billede horsmark Nybegynder
30. april 2006 - 13:58 #6
har du overvejet at lave hele valideringen i hånden istedet for at lade dreamveaver gøre dette... for det er jo ikke til at fatte en hat af dreamweaver koden *G*
Avatar billede submitt Nybegynder
30. april 2006 - 14:04 #7
Ja - men problemet er at jeg ikke er hård nok til JavaScript til selv at lave denne validering.

Kan man evt. lave et nyt JavaScript der tjekker det med de 90 dage og så fra Submitknappen kalde dette javascript SAMTIDIG med at Submitknappen også kalder det eksisterende Javascript? Jeg er klar over at det så giver 2 alert-bokse, men det må jeg jo så leve med.
Avatar billede horsmark Nybegynder
30. april 2006 - 14:12 #8
præææcist ... :-) kan guide og give dig en god start
Avatar billede horsmark Nybegynder
30. april 2006 - 14:16 #9
Dette er et godt udgangspunkt ...

<script type="text/javascript">

function validateForm(frm){
    var sMsg    = ""

    // her kommer alt validaeringslogikken
    if ( 2 > 1 ) sMsg += "Hov 1 er mindre end 2 !\n"

    // submit kun hvis der ikke er beskeder
    if ( sMsg != "" ){
        alert(sMsg)
        return false
    } else {
        return true
    }
}

</script>

<style type="text/css">
form {
    background-color:#ccc;
    width:650px;
}
label {
    clear:both;
    width:250px;
}
label, input, textarea, .info { float: left; }

.info {    font-style:italic; }
.required {    color:#f00; }

</style>

<form method="post" action="" name="form1" onsubmit="return validateForm(this)">
    <label>Skal der beregnes i fremtiden? <span class="required">*</span></label>
    <input type="checkbox" onClick="">

    <label>Hvilken dato starter aktiviteten? <span class="required">*</span></label>
    <input type="text" name="startdato" size="16"><span class="info">(dd-mm-&aring;&aring;&aring;&aring;)</span>
    <label>Hvilken dato slutter aktiviteten?</label>
    <input type="text" name="slutdato" size="16"><span class="info">(dd-mm-&aring;&aring;&aring;&aring;)</span>
    <label>&nbsp;</label><input type="submit" value="gem">
</form>
Avatar billede submitt Nybegynder
30. april 2006 - 14:24 #10
Ok - det du fortæller med dette er at jeg kalder scriptet med en onSubmit på selve formen. Men hvordan skal selve scriptet så se ud for at validere om det er 90 dage større end dags dato? Datoformatet i dato-feltet er dd-mm-yyyy og jeg laver en validering så snart brugeren har indtastet datoen, så den skulle være i det rigtige datoformat i det øjeblik formen submitter.
Avatar billede horsmark Nybegynder
30. april 2006 - 14:26 #11
og så kan du jo stille og roligt tilføje din logik ét inputfelt af gangen... således

    // her kommer alt validaeringslogikken
    if ( frm.startdato == "" ){
      sMsg += "Du mangler at udfyld startdato !\n"
    } else if ( !check_date(frm.startdato) ){
      sMsg += "Du har ikke udfyldt korrekt startdato !\n"
    }

..osv...
Avatar billede horsmark Nybegynder
30. april 2006 - 14:27 #12
jeg vil mene at det er en god idé ikke at have onblur validering men istedet lade brugeren taste hvad som helst og så validere alle felter af én omgang ... jeg syns det er langt mere brugervenligt
Avatar billede horsmark Nybegynder
30. april 2006 - 14:28 #13
det gør også koden mere gennemskuelig da du så ved at der kun valideres ét sted i én javascript funktion...
Avatar billede submitt Nybegynder
30. april 2006 - 14:37 #14
Jeg tror vi misforstår hinanden. Jeg vil bibeholde den nuværende validering der er lavet af Dreamweaver. Jeg vil ikke til at lave min egen validering på alle felterne. Det er jeg ikke hård nok til. Desuden valideres der ikke kun for om der er indtastet noget i felterne. Der valideres også for korrekt mailadresse, kun numeriske værdier osv. Derfor vil jeg bibeholde Dreamweavers validering og så lave en ekstra validering omkring de 90 dage. Jeg må leve med at brugeren så risikerer at få 2 alerts.

Ang. det med at jeg bruger onBlur på datofeltet, så er det ikke en funktion der forstyrrer brugeren. Det er en funktion der automatisk retter datoformatet såfremt brugeren har indtastet det forkert - men uden at give brugeren besked herom.

Hvis jeg nu prøvewr at stille mit oprindelige spørgsmål en gang til, men vi glemmer ALT om at jeg har noget eksisterende validering, hvordan ville scriptet så se ud?

Og her er så det opprindelige spørgsmål:

Jeg har en formular med et text-field hvor brugeren skal indtaste en dato i formatet dd-mm-yyyy. Derudover har jeg en check-boks. Såfremt brugeren har sat "flueben" i checkboksen skal følgende regel være gældende for dato-feltet: Den indtastede dato skal være MERE end 90 dage fra dags dato (ud i fremtiden) og formularens data må ikke sendes før før dette udsagn er rigtigt.Hvis den indtastede dato er MINDRE end 90 dage fra dags dato skal der komme en fejlmeddelelse.
Avatar billede horsmark Nybegynder
30. april 2006 - 15:10 #15
<script type="text/javascript">

function checkDate(s){
    if ( document.getElementById('calcDate').checked ) {
        var sDate = document.getElementById(s).value
        var oDate = new Date()
        var iYear     = parseInt( sDate.substr(6) )
        var iMonth    = parseInt( sDate.substr(3,2) ) -1
        var iDay     = parseInt( sDate.substr(0,2) )
        oDate.setFullYear(iYear,iMonth,iDay)

        var oDateToday=new Date()

        var oDateMax=new Date()
        oDateMax.setDate(oDateMax.getDate()+90)
        if (  oDate <= oDateMax && oDate > oDateToday ) {
            alert(oDate.toLocaleString() + " er ok!")
        } else {
            alert("Datoen må maks være " + oDateMax.toLocaleString() + " og minimum " +  oDateToday.toLocaleString())
        }
    }
}
</script>

<form method="post" action="" name="form1">
    <label>Skal der beregnes i fremtiden? <span class="required">*</span></label>
    <input id="calcDate" type="checkbox">
    <label>Dato</label>
    <input type="text" id="startdato" name="startdato" size="16"><span class="info">(dd-mm-&aring;&aring;&aring;&aring;)</span>

    <input type="button" onclick="checkDate('startdato')" value="check indtastet dato">
</form>
Avatar billede horsmark Nybegynder
30. april 2006 - 15:13 #16
doh ovenstående er maksimum 90 dage fra idag ...  hermed tilrettet

<script type="text/javascript">
function checkDate(s){
    if ( document.getElementById('calcDate').checked ) {
        var sDate = document.getElementById(s).value
        var oDate = new Date()
        var iYear     = parseInt( sDate.substr(6) )
        var iMonth    = parseInt( sDate.substr(3,2) ) -1
        var iDay     = parseInt( sDate.substr(0,2) )
        oDate.setFullYear(iYear,iMonth,iDay)

        var oDateMax=new Date()
        oDateMax.setDate(oDateMax.getDate()+90)
        if (  oDate > oDateMax ) {
            alert(oDate.toLocaleString() + " er ok!")
        } else {
            alert("Datoen skal være efter " + oDateMax.toLocaleString() )
        }
    }
}
</script>
Avatar billede submitt Nybegynder
30. april 2006 - 15:27 #17
DEt ser sgu' ud til at det virker. DOG på nær en væsentlig detalje. Jeg kan jo ikke kalde scriptet onClick da jeg allerede kalder et andet script. Derfor kalder jeg der onSubmit på selve formularen. Men .... det bevirker at jeg fint nok får min alert hvis datoen ikke er langt nok ude i fremtiden men desværre submitter formen alligevel. Hvordan undgår jeg det? Den må jo kun submittes såfremt brugeren har rettet datoen.
Avatar billede horsmark Nybegynder
30. april 2006 - 15:42 #18
Du skal have en return med

onsubmit="return checkDate('startdato')"

og så rette i scriptet

        oDateMax.setDate(oDateMax.getDate()+90)
        if (  oDate > oDateMax ) {
            return true
        } else {
            alert("Datoen skal være efter " + oDateMax.toLocaleString() )
            return false
        }
Avatar billede horsmark Nybegynder
30. april 2006 - 15:42 #19
og det skule være et svar ;-)
Avatar billede submitt Nybegynder
30. april 2006 - 15:57 #20
Det virker. Og det virker faktisk rigtig godt at det er 2 seperate alerts!!! Du er dagens helt! :-)
TAK!
Avatar billede horsmark Nybegynder
30. april 2006 - 16:05 #21
thx og sorry for at jeg nærmest overfaldte dig for at du skulle bygge det selv... men sådan er jeg... læs evt mere i mit ministatement på min eksperten-konto *g*
Avatar billede submitt Nybegynder
30. april 2006 - 16:36 #22
Det er helt i orden - men som nævnt er jeg ikke en haj til JS og derfor ville det blot gøre min opgave mere uoverskuelig. Endnu engang tak!
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