Ciao br1 e grazie per la risposta, non posso utilizzare la tua soluzione, mi spiego meglio quindi, perchè quello che devo fare è più complesso. Ho un campo input dove devo controllare che l'immissione dei dati rispetti determinate regole:
Il campo accetta solo numeri e virgole, non si può cominciare con una virgola, due virgole non possono mai essere vicine, le cifre che compongono i numeri possono essere al massimo di 3, quindi ogni numero può essere di 1, 2 o 3 cifre, ogni numero deve esse separato da una virgola, i numeri possono essere infiniti (quindi non posso utilizzare maxlength).
Esempio di inserimento valido: 5,41,548,999,1
Ho già scritto lo script che fa questo e l'unico problema che mi rimane in sospeso è quello della mia domanda, quindi ti chiedo, hai una soluzione alla mia prima domanda?
Ti posto il codice per completezza:
codice:
/* keypress mi permette di lavorare sul tasto premuto ancor prima che il carattere venga scritto nell'elemento di input
le ripetizioni possono essere numeri secchi da massimo 3 cifre, oppure dei ladder che hanno sempre massimo 3 cifre e sono separati da virgola per un numero infinito di volte
1,5,40,345,98, ... */
$(".ripetizioni").keypress(function(e)
{
//recupero quello che attualmente è stato inserito nell'input
var input = $(this).val();
// ottengo la posizione del cursore nell'elemento di input
var cursor = $(this).prop("selectionStart");
// lavoro solo se il primo carattere non è una virgola (44)
if (e.which != 44 || cursor != 0)
{
/* con e.which controllo il tasto premuto ancor prima di vederlo scritto nell'elemento di input, controllo che il carattere sia un numero (48~57),
oppure canc (0), oppure backspace (8), oppure una virgola (44), se non è uno di questi, la funzione termina subito senza stampare nulla nell'input */
if (e.which >= 48 && e.which <= 57 || e.which == 0 || e.which == 8 || e.which == 44)
{
/* String.fromCharCode(e.which) mi converte il tasto premuto (codice ascii) nella lettera corrispondente, il controllo if qui sotto dice che se
c'è una virgola nell'elemento di input e il cursore è vicino ad essa (o prima o dopo) e il tasto premuto è una virgola,
allora ho un caso di virgola-virgola (che non ammetto), quindi esco dalla funzione senza stampare nulla nell'input */
if (input.substr(cursor - 1, 1) + String.fromCharCode(e.which) != ",," && input.substr(cursor, 1) + String.fromCharCode(e.which) != ",,")
{
/* l'espressione qui sotto prende il contenuto già presente nell'elemento di input ed in più ci aggancia il tasto che sta per entrare da keypress,
sostanzialmente mi ricostruisce la stringa completa che sta per essere stampata nell'elemento di input */
stringa = input.substr(0, cursor) + String.fromCharCode(e.which) + input.substr(cursor);
// creo un vettore con tutte le cifre tra le virgole
var numeri = stringa.split(",");
var notok;
/* analizzo numero per numero (anche se rileggere tutti i numeri è un controllo oneroso e superfluo, sarebbe stato ancora più complicato analizzare solo quello che
sta intorno (nell'input) al tasto in entrata da keypress) */
$.each(numeri, function(index, value)
{
// ammetto solo numeri con lunghezza di cifre da 1 a 3, se il valore è maggiore di 3 cifre significa che in entrata su keypress c'è un quarto numero
if (value.length > 3)
notok = true;
});
// quindi se c'è un quarto numero termino la funzione senza stampare nulla
if (notok)
return false;
else
return true;
}
else
return false;
}
else
return false;
}
else
return false;
});