Page 1 sur 1

Désactiver nb champ texte selon nombre d'une liste

Posté : 20 août 2006, 22:25
par charabia
Bonsoir !

J'ai une liste déroulante comportant 1 à 5.

Juste en dessous j'ai 5 champs texte, tous "readonly" d'entrée.

Je désire désactiver ce readonly et rendre autant de champs actifs que le chiffre sélectionné de la liste déroulante.

En gros je choisis 3 dans la liste et hop 3 champs texte deviennent actifs.

Je pense que c'est en javascript que c'est possible. Qui aurait une idée ?

Merci !

Posté : 21 août 2006, 09:52
par Tictac
Voilà , j'ai testé , ca fonctionne bien ;)
<script language="javascript">
function changeRead(nb)
	{
	var boucle = parseFloat(nb) + parseFloat(1) ;
	//Débloquez tous
	for(i=1;i<6;i++)
		{
		divObj = document.getElementById('champ'+i);
		divInfo = document.getElementById('info'+i);
		if(divObj) 
			{
  			divObj.readOnly="readonly";
			divInfo.innerHTML="Read Only";
			}
		}
	//Bloquer
	for(i=1;i<boucle;i++)
		{
		divObj = document.getElementById('champ'+i);
		divInfo = document.getElementById('info'+i);
		if(divObj) 
			{
  			divObj.readOnly=false;
			divInfo.innerHTML="Read Only OFF";
			}
		}
	}
</script>

Nombre de champ (non en readonly)<select name="nb_champ" onchange="changeRead(this.value)">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select> <br />

<input name="champ1" id="champ1" type="text" size="30" /><span id="info1">Read Only Off</span><br />
<input name="champ2" id="champ2" type="text" size="30" readonly="readonly"/><span id="info2">Read Only</span><br />
<input name="champ3" id="champ3" type="text" size="30" readonly="readonly"/><span id="info3">Read Only</span><br />
<input name="champ4" id="champ4" type="text" size="30" readonly="readonly"/><span id="info4">Read Only</span><br />
<input name="champ5" id="champ5" type="text" size="30" readonly="readonly"/><span id="info5">Read Only</span><br />
++

Posté : 21 août 2006, 10:36
par Ryle
Le même :)
<script language="javascript"> 
function changeRead(nb,size) { 
  for(var i=1;i<size;i++) { 
    if(document.getElementById('champ'+i)) {
      document.getElementById('champ'+i).readOnly = (i<nb) ? false : "readOnly" ;
      document.getElementById('info'+i).innerHTML = (i<nb) ? "Read Only OFF" : "Read Only";  
    } 
  }
</script> 

changeRead(this.options[this.selectedIndex].value, this.length);
Nota : pensez au "var" dans le for(var i=1; ...), sinon le i est considéré comme global et peut poser problème avec d'autres scripts qui pourraient tourner en paralèlle :)

Posté : 21 août 2006, 11:41
par charabia
Merci beaucoup à vous deux !

Ton code marche nickel Tictac ;)

Ryle, ton code est beaucoup plus simplifié mais je en comprend pas quelque chose. Il est en retard d'un nombre lol

Quand je choisis 1, aucun champ n'est actif, 2, un seul est actif...etc

Tu as oublié un tit } à la fin :langue:

Une autre tite chose pour les surdoués :) Si je met un style, par exemple un fond gris pour l'état readonly, peut-on quand cet état devient actif mettre un autre style ?

Merci !

Posté : 21 août 2006, 12:01
par Cyrano
Oui dans la mesure ou chaque champ peut être identifié individuellement, ce qui est vrai dans le cas présent puisque chaque champ dispose d'un attribut id : dans ce cas, sauf erreur de ma part, tu peux faire quelque chose du genre :

Code : Tout sélectionner

forms['id-du-formulaire'].elements.['id-du-champ-a-modifier'].style.backgroundColor = 'inherit';

Posté : 21 août 2006, 12:30
par charabia
Merci beaucoup Cyrano ;)

Je me suis aidé de ton code et j'ai trouvé le code qui colle bien :

Code : Tout sélectionner

document.getElementById('gymnase'+i).style.backgroundColor = '#fff';
Ce site peut être très utile pour ceux qui veulent ;) Il référence les propriétés selon les navigateurs.

:arrow: http://mozilla.tlk.fr/doc05.php

Posté : 21 août 2006, 13:32
par Truc
J'ai toujours revé modérer mon alter ego :twisted:

Et le [Résolu] ?

Ha c'est jouissif :lol:

Posté : 21 août 2006, 13:47
par Ryle
Ryle, ton code est beaucoup plus simplifié mais je en comprend pas quelque chose. Il est en retard d'un nombre lol

Quand je choisis 1, aucun champ n'est actif, 2, un seul est actif...etc
Arf ouep, j'ai loupé le fait que dans sa variable boucle il ajoutait 1. Le mieux du coup c'est de faire partir le for() de 0 :)

Code : Tout sélectionner

function changeRead(nb,size) { for(var i=0;i<size;i++) { if(document.getElementById('champ'+i)) { document.getElementById('champ'+i).readOnly = (i<nb) ? false : "readOnly" ; document.getElementById('champ'+i).style.backgroundColor = (i<nb) ? "#fff" : "#c0c0c0" ; document.getElementById('info'+i).innerHTML = (i<nb) ? "Read Only OFF" : "Read Only"; } } }
Tu peux aussi pour changer de style passer par .className = "nomDeTaClasse";
C'est parfois plus pratique quand tu as plusieurs valeurs à changer :)

Tu as oublié un tit } à la fin :langue:
Oui, mais moi j'aime les accolades, et quand on aime, on ne compte pas ;)
(comment ça c'est nul comme excuse ?! :))

Posté : 21 août 2006, 13:57
par charabia
Oui j'avais essayé de changé cette valeur mais ça ne marche toujours pas Ryle. Tu l'as testé chez toi ? C'est pi être un souci dans ma page entière si ça marche chez toi.

Posté : 21 août 2006, 14:21
par Cyrano
Tu as oublié un tit } à la fin :langue:
Oui, mais moi j'aime les accolades, et quand on aime, on ne compte pas ;)
(comment ça c'est nul comme excuse ?! :))
C'est effectivement une excuse tout à fait déplorable, ha il est joli l'exemple donné aux débutants tiens :langue:

Posté : 21 août 2006, 15:48
par Ryle
Ouep ça fonctionnait chez moi, mais je vies de réaliser que c'est parce que mes champs partaient de 0 et pas de 1... en fait pour rectifier ma fonction par rapport au script donné par TicTac, il faut mettre "<=" au lieu de "<" dans le (i<nb) pis ca devrait le faire :)

Posté : 21 août 2006, 16:32
par charabia
C'est bien ça ;)

Merci à tous !

Posté : 22 août 2006, 07:55
par Tictac
hello , je fais partir de ma boucle de 1 car c'est le i qui détermine mon champ (champ1,champ2,etc) mais j'avoue que j'ai zappé le <= !!! qui m'eviterait de faire +1 :lol:

++