11549 sujets

JavaScript, DOM et API Web HTML5

Salut !

On commence par un petit bout de code pour illustrer le problème :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<title>Document sans nom</title>
		
		<script type="text/javascript">
			<!--/*--><![CDATA[//><!--
				var init=function(){
					document.getElementById('toto').addEventListener('change', function(event){alert('toto:'+event.target.checked)}, false);
					document.getElementById('titi').addEventListener('change', function(event){alert('titi:'+event.target.checked)}, false);
				}
				
				window.addEventListener('load', init, false);
			//--><!]]>
		</script>
	</head>

	<body>
		<fieldset>
			<input type="radio" name="test" id="toto" />
			<input type="radio" name="test" id="titi" />
		</fieldset>
	</body>
</html>


Rien de bien sorcier, 2 radios, toto et titi, auquels j'ai attaché un évènement qui, lorsque leur état change, affiche le nom du radio concerné et son état.

Personnellement, en cochant un radio, je m'attendais à avoir 2 messages, l'un indiquant qu'un des radios était coché et l'autre indiquant que le deuxième radio était décoché. Hors seule le premier message s'affiche. Ce qui signifie que l'évènement onchange n'est déclenché que lorsqu'un radio est coché (tester sur tous les navigateurs W3C communs (Firefox, Opera et Chrome).

La question est alors de savoir comment détecter le décochage d'un radio ?

Merci ^^
Modifié par MacIntoc (28 Jan 2009 - 10:57)
J'ai un peu cherché, mais j'ai pas d'idée, j'ai toujours eu besoin de savoir que le cochage. Peut etre en observant le onchange sur tous les autres ?
Modifié par fabien.menager (02 Feb 2009 - 16:33)
Salut fabien.menager,

Pour moi se comportement n'a rien d'anormal, vu que dans la définition d'un bouton radio, seulement 1 des boutons peut être coché à la fois (à la différence des checkbox)

Ma question est donc, que cherche tu as faire au final ? parce que bon... si t'arrive à détecter d'un bouton est coché, tu peux en déduire que tous les autres ne le sont pas
Smiley smile
Pour moi non plus ça n'a rien d'anormal, et je viens de me rendre compte que j'ai ecrit "decochage" au lieu de "cochage", je change tout de suite. Et appelle moi Fabien Smiley cligne
Je pense qu'il veut savoir quel élément vient d'être décoché. Peut être qu'il peut arriver a ses fins en gardant un tableau de booléens en parallèle de ses radios buttons, qu'il scrute a chaque onchange et connaitra alors quel élément est à true dans le tableau, et décoché
Modifié par fabien.menager (02 Feb 2009 - 16:33)
En fait, j'ai plusieurs autres contrôles liées à un radio, l'idée étant d'activer ou désactiver les contrôles en fonction de l'état du radio dont ils dépendent (activés quand le radio est coché, désactivés quand il est décoché).

Le problème, c'est que comme l'évènement onchange ne s'active pas lorsque le radio est décoché, les contrôles ne sont jamais désactivés.

y a toujours la solution de demander au radio qui a été coché de faire le tour des contrôles pour les désactiver puis d'activer ses propres contrôles, mais je trouve pas ça très propre et assez lourd.

Donc je me demandais si y avait pas une solution plus élégante, à savoir détecter le décochage des radios.
Je pense qu'a chaque cochage, tu devrais cacher tous les contrôles (donc seulement les contrôles liés au radio précédemment coché) puis afficher seuls les groupes liés au radio button coché.
Si tu n'en as pas trop, ça devrait être instantané et le temps ou aucun contrôle n'est affiché devrait être nul.
Ben... en faite, c'est précisément cette méthode que j'aimerais éviter Smiley lol
Si y a pas d'autre solution, je passerais par là mais je voulais d'abord être sûr qu'il n'y a pas d'autres solutions pour obtenir une détection plus précise du changement d'état d'un radio.
D'après ce que je sais : non. L'événement n'est pas déclenché par le navigateur, on ne peut pas l'y forcer, il faut passer par autre chose. Si j'avais eu le même problème que toi, j'aurais fait ce que je t'ai dit. Après, il a peut être un meilleur ordre dans les actions à effectuer, le seul moyen de savoir c'est de tester.