[Javascript] Problème de champs, tabulations

Résolu
HostOfSeraphim Messages postés 7340 Statut Contributeur -  
 baramogo99 -
Bonsoir,

Un petit problème que je n'ai pas réussi à résoudre cet après-midi.

Je cherche à faire en sorte que l'utilisateur ne soit pas obligé d'utiliser la tabulation ou sa souris pour remplir les 3 champs d'une date (jour, mois, année). J'ai donc prévu une fonction pour que le focus change dès que 2 caractères sont entrés dans le champ.

Seulement voilà, je souhaiterais également que dans le cas où l'utilisateur souhaite apporter une modification à ses valeurs (sans tout effacer), ce système soit capable de modifier certaines valeurs seulement, en les sélectionnant.

Voici ce que j'ai pour le moment :

<html>
<head>
</head>
<body>
<script language="Javascript">
function ChampSuivant(actuel, suivant, limite)
{
	if (actuel.value.length == limite) 
	{
			suivant.focus();
	}
}
</script>
<form name="form">
<input type="text" name="champ1" size=2 maxlength=2 onKeyUp="ChampSuivant(champ1,champ2,2)"> / 
<input type="text" name="champ2" size=2 maxlength=2 onKeyUp="ChampSuivant(champ2,champ3,2)"> / 
<input type="text" name="champ3" size=2 maxlength=2 onKeyUp="ChampSuivant(champ3,champ4,2)">
<br/>
<input type="text" name="champ4" size=2 maxlength=2 onKeyUp="ChampSuivant(champ4,champ5,2)"> / 
<input type="text" name="champ5" size=2 maxlength=2 onKeyUp="ChampSuivant(champ5,champ6,2)"> / 
<input type="text" name="champ6" size=2 maxlength=2>
</form>
</body>
</html>


Essayez de remplir les champs, et revenez dans le premier champ pour apporter des modifications : le focus "saute" le champ suivant et se place un champ trop loin.

Quelqu'un saurait-il m'indiquer ce que je fais de mal ? Je ne vois pas la logique qui fait que le focus aille trop loin dans ce cas.

Merci !

--
Configuration : Linux Debian Lenny / Noyau 2.6.26 / Gnome / Iceweasel 3
Connexion Internet : ADSL Orange 8M (Livebox)
Configuration: OS : Linux CentOS 5.3
Noyau : 2.6.18
Environnement graphique : Gnome
Navigateur : Firefox 3
Processeur : Intel Quad Core Q6600
Carte mère : Gigabyte GA-E7AUM-DS2H
RAM : 8 Go (OCZ)
Disques durs : 2x1 To Seagate Barracuda
Carte graphique : Chipset Nvidia Geforce 9400
Boîtier : Antec P182
Ventirad : Noctua NH-U12P
Alimentation : Corsair HX520W
Moniteur : Samsung 22 pouces (SyncMaster 2233BW)

2 réponses

HostOfSeraphim Messages postés 7340 Statut Contributeur 1 609
 
Solution trouvée :

<html>
<head>
</head>
<body>
<script language="Javascript">
var cpt = 0;
function ChampSuivant(actuel, suivant, limite)
{
	cpt++;
	if (cpt == limite) 
	{ 
		suivant.select(); 
		cpt = 0;
	}	
}
</script>
<form name="form">
<input type="text" name="champ1" size=2 maxlength=2 onKeyUp="ChampSuivant(champ1,champ2,2)"> / 
<input type="text" name="champ2" size=2 maxlength=2 onKeyUp="ChampSuivant(champ2,champ3,2)"> / 
<input type="text" name="champ3" size=2 maxlength=2 onKeyUp="ChampSuivant(champ3,champ4,2)">
<br/>
<input type="text" name="champ4" size=2 maxlength=2 onKeyUp="ChampSuivant(champ4,champ5,2)"> / 
<input type="text" name="champ5" size=2 maxlength=2 onKeyUp="ChampSuivant(champ5,champ6,2)"> / 
<input type="text" name="champ6" size=2 maxlength=2>
</form>
</body>
</html>


Le problème se produisait lors d'une frappe rapide, suffisamment rapide pour que le onKeyUp réagisse trop tard. De cette manière, comme c'est le onKeyUp qui incrémente le compteur, le changement de focus ne peut se faire tant qu'il n'est pas "revenu".

2
baramogo99
 
En améliorer:
avec un appel de cette fonction du type : onkeypress="sauterchamp(this);" dans un input.

function sauterchamp(element){
if(element.value.length>=element.maxLength){
numchampsuivant=Number(element.name.substr(element.name.length-1));
nomchampsuivant=element.name.substr(0,element.name.length-1);
numchampsuivant++;
nomchampsuivant+=numchampsuivant;
eval("document.ficheparticipant."+nomchampsuivant+".focus()");
}
}

A NOTER QU'IL FAUT QUE LES NOMS DES INPUT AIENT UN TRONC COMMUN ET UN CHIFFRE QUI SE SUIT.
EXEMPLE: champ1 | champ2 | champ 3 etc...
CODE VALABLE JUSQU'A 10 CHAMPS. SINON A MODIFIER.
0