Avatar billede 1409 Praktikant
20. november 2004 - 19:53 Der er 7 kommentarer og
1 løsning

validering af dato og text-input

Følgende script validerer på dato for gyldighed, hvilket fungere perfekt:

<SCRIPT LANGUAGE="JavaScript">

<!-- Begin

function isValidDate(dateStr) {
    // Checks for the following valid date formats:
    // dd-mm-yyyy  dd.mm.yyyy
    // Also separates date into day, month, and year variables

    var datePat = /^(\d{1,2})(\.|-)(\d{1,2})\2(\d{4})$/;

    var matchArray = dateStr.match(datePat); // is the format ok?
    if (matchArray == null) {
        alert("Date is not in a valid format.")
        return false;
    }
    // parse date into variables
    day = matchArray[1];
    month = matchArray[3];
    year = matchArray[4];
    if (month < 1 || month > 12) { // check month range
        alert("Month must be between 1 and 12.");
        return false;
    }
    if (day < 1 || day > 31) {
        alert("Day must be between 1 and 31.");
        return false;
    }
    if ((month==4 || month==6 || month==9 || month==11) && day==31) {
        alert("Month "+month+" doesn't have 31 days.")
        return false
    }
    if (month == 2) { // check for february 29th
        var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
        if (day>29 || (day==29 && !isleap)) {
            alert("February " + year + " doesn't have " + day + " days.");
            return false;
        }
    }
    var toDay = new Date()//sets today date
    var newDate = new Date(year,month-1,day)//sets the new input date
    var dif = newDate-toDay;//difference in miliseconds
    dif = Math.ceil(dif/1000/60/60/24);//difference in days
    if(dif<0){//if the date is in the past
        alert('The date is in the past. Please input a valid date!');
        //document.forms[0].elements['date'].value='';
        return false;
    }
   
    return true;  // date is valid
}
//  End -->
</SCRIPT>

<FORM ACTION="" METHOD="post" onSubmit="return isValidDate(this.date.value);">
Skriv dato:  <INPUT TYPE="text" NAME="date" SIZE="10" MAXLENGTH="10"> (dd.mm.åååå) 
<INPUT TYPE="submit" VALUE="Dato"><BR>


Problemet er, at jeg forsøgt på at tilføje et obligatorisk text-felt (headline). Et eller andet går galt, for der sker intet, dvs. ej heller dato-valideringen virker længere. Dette script virker altså ikke:

<SCRIPT LANGUAGE="JavaScript">
<!-- Begin

function isValidDate() {
    if (myForm.headline.match.value == null){
        alert("Headline is missing.");
        return false;
    }
    // Checks for the following valid date formats:
    // dd-mm-yyyy  dd.mm.yyyy
    // Also separates date into day, month, and year variables

    var datePat = /^(\d{1,2})(\.|-)(\d{1,2})\2(\d{4})$/;

    var matchArray = myForm.date.match.value(datePat); // is the format ok?
    if (matchArray == null) {
        alert("Date is not in a valid format.")
        return false;
    }
    // parse date into variables
    day = matchArray[1];
    month = matchArray[3];
    year = matchArray[4];
    if (month < 1 || month > 12) { // check month range
        alert("Month must be between 1 and 12.");
        return false;
    }
    if (day < 1 || day > 31) {
        alert("Day must be between 1 and 31.");
        return false;
    }
    if ((month==4 || month==6 || month==9 || month==11) && day==31) {
        alert("Month "+month+" doesn't have 31 days.")
        return false
    }
    if (month == 2) { // check for february 29th
        var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
        if (day>29 || (day==29 && !isleap)) {
            alert("February " + year + " doesn't have " + day + " days.");
            return false;
        }
    }
    var toDay = new Date()//sets today date
    var newDate = new Date(year,month-1,day)//sets the new input date
    var dif = newDate-toDay;//difference in miliseconds
    dif = Math.ceil(dif/1000/60/60/24);//difference in days
    if(dif<0){//if the date is in the past
        alert('The date is in the past. Please input a valid date!');
        //document.forms[0].elements['date'].value='';
        return false;
    }
    return true;  // date is valid
}
//  End -->
</SCRIPT>

<FORM ACTION="" METHOD="post" onSubmit="return isValidDate();">
Skriv dato:  <INPUT TYPE="text" NAME="date" SIZE="10" MAXLENGTH="10"> (dd.mm.åååå)<BR>
Tekst: <TEXTAREA COLS="70" ROWS="2" NAME="headline" WRAP=virtual></TEXTAREA><BR>
<INPUT TYPE="submit" VALUE="Dato"><BR>
</FORM>
Avatar billede skovenborg Nybegynder
20. november 2004 - 23:09 #1
Prøv:
<SCRIPT LANGUAGE="JavaScript">
<!-- Begin

function isValidDate(myForm) {
    if (!myForm.headline.value.match(/[\S]/ig)){
        alert("Headline is missing.");
        return false;
    }
    // Checks for the following valid date formats:
    // dd-mm-yyyy  dd.mm.yyyy
    // Also separates date into day, month, and year variables

    var datePat = /^(\d{1,2})(\.|-)(\d{1,2})\2(\d{4})$/;

    var matchArray = myForm.date.value.match(datePat); // is the format ok?
    if (matchArray == null) {
        alert("Date is not in a valid format.")
        return false;
    }
    // parse date into variables
    day = matchArray[1];
    month = matchArray[3];
    year = matchArray[4];
    if (month < 1 || month > 12) { // check month range
        alert("Month must be between 1 and 12.");
        return false;
    }
    if (day < 1 || day > 31) {
        alert("Day must be between 1 and 31.");
        return false;
    }
    if ((month==4 || month==6 || month==9 || month==11) && day==31) {
        alert("Month "+month+" doesn't have 31 days.")
        return false
    }
    if (month == 2) { // check for february 29th
        var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
        if (day>29 || (day==29 && !isleap)) {
            alert("February " + year + " doesn't have " + day + " days.");
            return false;
        }
    }
    var toDay = new Date()//sets today date
    var newDate = new Date(year,month-1,day)//sets the new input date
    var dif = newDate-toDay;//difference in miliseconds
    dif = Math.ceil(dif/1000/60/60/24);//difference in days
    if(dif<0){//if the date is in the past
        alert('The date is in the past. Please input a valid date!');
        //document.forms[0].elements['date'].value='';
        return false;
    }
    return true;  // date is valid
}
//  End -->
</SCRIPT>

<FORM ACTION="" METHOD="post" onSubmit="return isValidDate(this);">
Skriv dato:  <INPUT TYPE="text" NAME="date" SIZE="10" MAXLENGTH="10"> (dd.mm.åååå)<BR>
Tekst: <TEXTAREA COLS="70" ROWS="2" NAME="headline" WRAP=virtual></TEXTAREA><BR>
<INPUT TYPE="submit" VALUE="Dato"><BR>
</FORM>
Avatar billede skovenborg Nybegynder
20. november 2004 - 23:24 #2
Scriptet før virkede ikke af følgende grunde:
1:
if (myForm.headline...
her burde myForm referere til et form-element, hvilket den ikke før, da den slet ikke er defineret nogle steder. Det ordner vi ved at smide form-elementet ind som argument i funktionen:
function isValidDate(myForm) {
På den måde kan vi kalde funktionen med:
onSubmit="return isValidDate(this);"
hvor this henviser til det form-element du kalder funktionen fra. Nu bliver den så lagt ind i myForm, som nu endelig eksisterer.

2:
myForm.headline.match.value kan man desværre ikke skrive. match er nemlig en methode, som bruger på strenge til at afprøve en regular expression - præcis som du gør i dit forrige script. Da det nu er value, vi skal teste af, skal du bare bytte om på value og match, samt huske at tilføje en regular-expression:
if (!myForm.headline.value.match(/[\S]/ig)){
Vi har her droppet == null, da ting kun er null når de ikke eksisterer, hvilket man ikke kan påstå hverken textarea'et eller dets value er (value er måske tom, men eksisterer på sin vis stadig ;-)
Samme ting retter vi lidt senere hvor du har skrevet:
myForm.date.match.value(datePat);
hvilket skal være:
myForm.date.value.match(datePat);
Avatar billede 1409 Praktikant
20. november 2004 - 23:33 #3
Wheee.... takker mange gange!
Ikke mindst for forklaringen! :-)
Avatar billede skovenborg Nybegynder
20. november 2004 - 23:33 #4
skal jeg være så fræk at smide et svar så ;-)
Avatar billede 1409 Praktikant
20. november 2004 - 23:36 #5
Jeps, gerne!
Avatar billede skovenborg Nybegynder
21. november 2004 - 00:10 #6
...og det er hermed gjort :-)
Avatar billede 1409 Praktikant
21. november 2004 - 00:25 #7
Sådan
(Jeg håber at du får dine points nu...)
Avatar billede skovenborg Nybegynder
21. november 2004 - 00:37 #8
jamen det gik fint - tak for points :-)
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