Newsgroup: it.comp.lang.javascript
Titolo: format in javascript

Buona giornata a tutti,
ho questo problema e mi sto incartando....
Sto editando su una textbox ed associato ho un determinato formato da
rispettare.
Se ad esempio il formato è '##99aa'  l'utente può inserire per i primi due
caratteri solo cifre o lettere, per il 3° e 4° carattere solo cifre e per
gli ultimi due solo lettere. Una FORMAT in sostanza. Se l'utente sbaglia,
vorrei anche cancellare il carattere scritto.
Solo che la maschera di input la pesco da un database e quindi cambia in
base al TEXT INPUT dove l'utente sta scrivendo. In pratica vorrei realizzare
una funzione dinamica.
Io l'ho definita così:
onkeyup="return f_mask_edit(this.value,event.keyCode,'##aa99');"
e poi all'interno della funzione ho fatto un ciclo per sapere a che punto si
trova e se non va bene
elimino.....ma non funziona.
function f_mask_edit(valore,carattere,maschera)
{
    var elemento;
    var i = 0;
    while (i<maschera.length)
    {
        if (i == valore.length-1)
        {
            alert('maschera1 ' + maschera.substr(i,1));
            break;
         }
         i++;
    }
    if ((maschera.substr(i,1)=='#')&& ( ( ((carattere<48) || (carattere>57))
&& ((carattere<65) || (carattere>90)) && ((carattere<97) ||
(carattere>122)) ) ) )             { alert('Attenzione. Inserire una cifra
od una lettera.'); valore = valore.substr(0,valore.length-1); return
false; }
    else if ((maschera.substr(i,1)=='9')&&((carattere<48) ||
(carattere>57)))
    { alert('Attenzione. Inserire una cifra.'); valore =
valore.substr(0,valore.length-1); return false; }
    else if ((maschera.substr(i,1)=='a')&&((((carattere<65) ||
(carattere>90)) && ((carattere<97) || (carattere>122)))))
    { alert('Attenzione. Inserire una cifra od una lettera.'); valore =
valore.substr(0,valore.length-1); return false; }
    return true;
}


anzitutto una osservazione sull'approccio: quello che ti interessa e'
l'ultimo carattere digitato, se va bene passa, altrimenti segnali l'errore.
i precedenti si suppone siano gia' corretti.
io implementerei la cosa con le espressioni regolari, e farei piu' o meno
cosi':
<input type="text" name="foo" onkeyup="verifyMask(this, '##aa99');" />
function verifyMask(text, mask)
{
   var val = text.value,
       len = val.length,
       pos = len - 1,
       chr = val.charAt(pos),
       msk = mask.charAt(pos),
       reg,
       msg;
   if (len > mask.length)
   {
       alert('Dimensione massima superata');
       text.value = text.value.substring(0, mask.length);
   }
   switch (msk)
   {
       case '#': reg = /[a-zA-Z0-9]/; msg = 'una lettera o un numero'; break;
       case '9': reg = /[0-9]/; msg = 'un numero'; break;
       case 'a': reg = /[a-zA-Z]/; msg = 'una lettera';
   }
   if (!chr.match(reg))
   {
       alert('Errore nell\'inserimento: in questa posizione puoi inserire soltanto
' + msg);
       text.value = text.value.substring(0, pos);
   }
}
--
artemis.alpeia
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

Il mio non funzionava perchè mi ero incartato con le OR e AND......(ora
funziona)
ma devo dire che la tua soluzione è decisamente migliore....
mille grazie!!!
Ciao ciao.
Andrea.

Effettivamente però se torno all'inizio del text, cancello un carattere e lo
sostituisco con uno che non va bene non segnala l'errore.
Ora guardo se riesco a superare questo intoppo.
Ciao.
Andrea.

Cazzarola un altro errore....stranissimo...
se devo inseire una cifra e digito velocemente due lettere nella seconda dà
l'errore (alert) ma la prima l'accetta.
Andrea.


questo e' dovuto all'asincronicita' della chiamata del metodo e della
compilazione del campo da tastiera, potresti cercare di velocizzare la
routine sfoltendo un po' di cose superflue, il tuo primo errore invece penso
dipenda dal backspace, che va trattato a parte.




Senza l' alert() funziona, trova un altro modo per informare l' utente.
-- 
  [web]   
www.gfcarlotti.it
 
www.gfcarlotti.it/trekking/
          [mail]   
gianf...@gfcarlotti.it
                 [pgp]  
www.gfcarlotti.it/pgp/franco.asc