Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    Aiuto in uno script di validazione

    Salve a tutti,
    ho trovato un ottimo script di validazione della data che verifica i giorni di ciascun mese, persino se l'anno inserito è bisestile per accettare il 29 febbraio.
    Fin qui massimo giubilo , poi mi sono accorta che il formato era mm/gg/aaaa mentre io avrei voluto il classico gg/mm/aaaa.

    Essendo di una consistente incompetenza in materia di javascript ,
    volevo un aiuto per modificarlo al fine di adattarlo alla mia esigenza.

    Spero qualcuno sia in grado,
    ecco lo script:


    <script language = "Javascript">
    /**
    * DHTML date validation script.
    */
    // Declaring valid date character, minimum year and maximum year
    var dtCh= "/";
    var minYear=1900;
    var maxYear=2100;

    function isInteger(s){
    var i;
    for (i = 0; i < s.length; i++){
    // Check that current character is number.
    var c = s.charAt(i);
    if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
    }

    function stripCharsInBag(s, bag){
    var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++){
    var c = s.charAt(i);
    if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
    }

    function daysInFebruary (year){
    // February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
    }
    function DaysArray(n) {
    for (var i = 1; i <= n; i++) {
    this[i] = 31
    if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
    if (i==2) {this[i] = 29}
    }
    return this
    }

    function isDate(dtStr){
    var daysInMonth = DaysArray(12)
    var pos1=dtStr.indexOf(dtCh)
    var pos2=dtStr.indexOf(dtCh,pos1+1)
    var strMonth=dtStr.substring(0,pos1)
    var strDay=dtStr.substring(pos1+1,pos2)
    var strYear=dtStr.substring(pos2+1)
    strYr=strYear
    if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
    if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
    for (var i = 1; i <= 3; i++) {
    if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
    }
    month=parseInt(strMonth)
    day=parseInt(strDay)
    year=parseInt(strYr)
    if (pos1==-1 || pos2==-1){
    alert("The date format should be : mm/dd/yyyy")
    return false
    }
    if (strMonth.length<1 || month<1 || month>12){
    alert("Please enter a valid month")
    return false
    }
    if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
    alert("Please enter a valid day")
    return false
    }
    if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
    alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear)
    return false
    }
    if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
    alert("Please enter a valid date")
    return false
    }
    return true
    }

    function ValidateForm(){
    var dt=document.frmSample.txtDate
    if (isDate(dt.value)==false){
    dt.focus()
    return false
    }
    return true
    }

    </script>




    Grazie ,
    Alex

  2. #2
    prova cambiando queste righe:

    codice:
    var strMonth=dtStr.substring(0,pos1)
    var strDay=dtStr.substring(pos1+1,pos2)
    in queste:

    codice:
    var strDay=dtStr.substring(0,pos1)
    var strMonth=dtStr.substring(pos1+1,pos2)
    ciao

  3. #3
    grazie var, il tuo suggerimento è stato perfetto!!!

    Adesso però avrei un altro problema, io ho un form con molti campi e come faccio a specificare allo script di interessarsi soltanto del textfield relativo alla data?

  4. #4
    Originariamente inviato da AleXXandra
    grazie var, il tuo suggerimento è stato perfetto!!!

    Adesso però avrei un altro problema, io ho un form con molti campi e come faccio a specificare allo script di interessarsi soltanto del textfield relativo alla data?
    vedi questa funzione?

    codice:
    function ValidateForm(){
    var dt=document.frmSample.txtDate
    if (isDate(dt.value)==false){
    dt.focus()
    return false
    }
    return true
    }
    è qui che specifichi il campo sul quale lo script di validazione dovrà agire. al posto di txtDate metti il nome del tuo campo e il gioco è fatto.

  5. #5
    Grazie var per le sempre puntuali precisazioni,
    adesso però il mio problema risiede nell'invocazione di tale script.

    Infatti io lo invoco aggiungendo
    onSubmit="return ValidateForm('nomedelcampo')"
    all'interno della definizione del form
    (dopo aver parametrizzato lo script originario rispetto al nome del campo da validare, modificando var dt=document.frmSample.txtDate con var dt=document.form1.elements[nomeTextfield])

    Ma come posso utilizzare lo stesso script per più campi all'interno dello stesso form?

    Mi servirebbe la possibilità di mettere in 'AND' i return (quindi le azioni) di ValidateForm ma non so se sia possibile, vista la mia poca pratica di scripting.

    Che faccio ?

    Grazie,
    Alex

  6. #6
    carissima, se mi dici quali e quanti campi vuoi sottoporre a controllo, ti scrivo io la funzione, ovviamente comprendendo anche il controllo sulla data.

    :)

  7. #7
    Carissimo sei tu var, sempre pronto e disponibile
    io mi limito a scocciare il prossimo con i miei costanti problemucci...

    Comunque, tornando alla questione,

    vorrei dare un senso più compiuto al problema:

    ho un form con numerosi campi fra cui alcuni di tipo data sui quali applicare un controllo di validità.

    L'ormai noto script in uso, è ottimo per il controllo di uno di essi, ciò che vorrei è poterlo usare su tutti.

    Se tuttavia la tua proposta di aiuto (comunque ben accetta) si limita alla modifica dello script aggiungendo in esso tante variabili quanti i campi interessati dalla validazione, mi sento di interrogarmi se ciò possa essere evitato.

    Infatti questo stesso script dovrà essere utilizzato anche da altre pagine con nomi e numero dei campi diversi.

    Quindi, anche in linea con una filosofia della modularità e del riuso basata dunque su di un alto livello di parametricità della funzione,
    preferirei che lo script si occupasse della sola validazione di un campo ma potesse essere invocato tante volte quante necessarie per la validazione di tutti i campi con data.

    In conclusione quindi, mi chiedevo se fosse possibile (e qui risiede la mia ignoranza) utilizzare un' invocazione del tipo:

    onSubmit="return ValidateForm('NomeCampoData1') AND return ValidateForm('NomeCampoData2')"

    oppure:

    onSubmit="return ValidateForm('NomeCampoData1') ; return ValidateForm('NomeCampoData2')"

    o ancora:

    onSubmit="return ValidateForm('NomeCampoData1')" onSubmit="return ValidateForm('NomeCampoData2')"
    insomma, credo di essere stata chiara...

    Attendo commento al mio quesito,
    AleX

  8. #8
    è possibilissimo mettere in and gli output delle funzioni che hai già.
    in particolare, si usa questa sintassi (in JavaScript l'and è &&):

    codice:
    <form name="mioform" onSubmit="return (ValidateForm('NomeCampoData1') && ValidateForm('NomeCampoData2'));">
    fammi sapere. :)

  9. #9
    Che dire...
    FUNZIONA!!!

    Grazie molte var per la pazienza adottata e per la flessibilità con la quale ti sei adattato a risolvere il problema a modo mio.

    D'altro canto, io in testa l'idea l'avevo... si trattava di conoscere la giusta sintassi, ma io (in quanto neofita della materia) non ne ero però all'altezza.

    Se non sparirai in villeggiatura estiva, è possibile che io possa tornare a scocciarti, altrimenti ti auguro buone vacanze.

    Alex

  10. #10
    Ok, nuovo problema:

    come potrei modificare il sopra menzionato script affinchè possa accettare anche un campo vuoto (oltre ovviamente ad una data valida)?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.