Basculer des valeurs entre 2 listes
Création : 06.08.2007
Mise(s) à jour : -
Introduction
> Ce code permet, dans un formulaire HTML, de faire passer des éléments d'une première liste de type <select> à une autre liste du même type, et ce sans avoir à soumettre le formulaire à chaque ajout/retrait.
> Il est possible de faire passer des éléments d'une liste à l'autre soit en double-cliquant sur un élément, soit en sélectionnant un ou plusieurs éléments et en cliquant sur les boutons 'ajouter' ou 'retirer', soit enfin de faire passer tous les éléments d'une liste à l'autre avec les boutons 'ajouter tout' ou 'retirer tout'.
> De plus, il est possible, au sein de la liste des éléments choisis, de modifier l'ordre des valeurs à l'aide de boutons 'monter' ou 'descendre'.
Avertissement
> Ce code est une synthèse de différents codes Javascript trouvés sur/diffusés par ToutJavascript.com et JavascriptFR.com, mais qui avaient comme inconvénient majeur de ne pas être forcément compatibles avec tout les navigateurs...
> Je ne suis donc pas l'auteur de ces différents codes, je me suis contenté de les mélanger, les adapter, et de renommer les fonctions afin que leur nom soit le plus explicite possible.
Basculer des valeurs entre 2 listes
a) Compatibilité
> Ce code partiellement ré-écrit a été testé avec succès avec Firefox 2 (
Windows et Mac OS X), Safari 2 (
Mac OS X) et Internet Explorer versions 6 et 7 (
Windows).
b) Codes sources
> Dans la partie
<head>[ ... ]
</head>, il faut mettre le code ci-après :
<script language="JavaScript" type="text/javascript">
function deplacer( liste_depart, liste_arrivee )
{
for( i = 0; i < liste_depart.options.length; i++ )
{
if( liste_depart.options[i].selected && liste_depart.options[i] != "" )
{
o = new Option( liste_depart.options[i].text, liste_depart.options[i].value );
liste_arrivee.options[liste_arrivee.options.length] = o;
liste_depart.options[i] = null;
i = i - 1 ;
}
else
{
}
}
}
function deplacer_tout( liste_depart, liste_arrivee )
{
for( i = 0; i < liste_depart.options.length; i++ )
{
o = new Option( liste_depart.options[i].text, liste_depart.options[i].value );
liste_arrivee.options[liste_arrivee.options.length] = o;
liste_depart.options[i] = null;
i = i - 1 ;
}
}
function deplacer_hautbas( liste, sens )
{
var listemax = liste.length - 2;
var listesel = liste.selectedIndex;
if( ( listesel < 0 ) || ( listesel < 1 && sens == -1 ) || ( listesel > listemax && sens == 1 ) )
{
return false;
}
tmpopt = new Option( liste.options[listesel+sens].text, liste.options[listesel+sens].value );
liste.options[listesel+sens].text = liste.options[listesel].text;
liste.options[listesel+sens].value = liste.options[listesel].value;
liste.options[listesel+sens].selected = true;
liste.options[listesel].text = tmpopt.text;
liste.options[listesel].value = tmpopt.value;
liste.options[listesel].selected = false;
return true;
}
function soumettre_2listes( liste1, liste2 )
{
var listelen1 = liste1.length;
for( i = 0; i < listelen1; i++ )
{
liste1.options[i].selected = true;
}
var listelen2 = liste2.length;
for( j = 0; j < listelen2; j++ )
{
liste2.options[j].selected = true;
}
}
function soumettre_1liste( liste )
{
var listelen = liste.length;
for( i = 0; i < listelen; i++ )
{
liste.options[i].selected = true;
}
}
</script>
> Et dans la partie
<body>[ ... ]
</body>, il faut mettre un formulaire auquel on associe à l'événement
OnSubmit soit la fonction
soumettre_1liste(), soit
soumettre_2listes(), selon si l'on veut récupérer les valeurs choisies ou bien les valeurs disponibles restantes *et* celles qui sont choisies.
> Notez bien la différence de syntaxe à l'intérieur même de la balise
<form> par rapport à la syntaxe dans les différents boutons.
Attention !
document.
forms[
0] désigne le premier formulaire de votre page/script. Si il y en plusieurs, vous devez mettre l'index qui correspond à l'ordre d'apparition des formulaires dans votre code source... En effet, dans le code d'exemple, j'ai inscrit 0, mais dans la réalité, comme j'ai un formulaire au sommet de la page de mon site, j'ai du inscrire dans le code source de mon exemple
document.
forms[
1] pour désigner le second formulaire...
> Ensuite, il faut bien entendu mettre aussi deux listes, avec une paire de crochet dans le nom (
pour dire que la variable qui en résultera sera un tableau, qui peut prendre plusieurs valeurs) et activer l'attribut
HTML multiple avec la valeur "multiple" en paramètre... L'événement
OnDblClick sur chaque liste est facultatif, mais permet, lorsqu'on double-clic sur une valeur, de la faire passer d'une liste à une autre.
<form name="export" method="post" OnSubmit="javascript: soumettre_1liste( document.forms[0].choix );" action="export.php">
<table summary="" border="0" cellpadding="0" cellspacing="0">
<tr>
<th style="width: 90px;"></th>
<th style="width: 220px;"></th>
<th style="width: 150px;"></th>
<th style="width: 220px;"></th>
<th style="width: 90px;"></th>
</tr>
<tr>
<td><br /></td>
<td>Champ(s) disponible(s)<br /></td>
<td><br /></td>
<td>Champ(s) sélectionné(s)<br /></td>
<td><br /></td>
</tr>
<tr>
<td><br /></td>
<td rowspan="7">
<select name="dispo[]" id="dispo" style="width: 210px;" size="16" multiple="multiple" OnDblClick="javascript: deplacer( this.form.dispo, this.form.choix );">
<option value="A">A<br /></option>
<option value="Z">Z<br /></option>
<option value="E">E<br /></option>
<option value="R">R<br /></option>
<option value="T">T<br /></option>
<option value="Y">Y<br /></option>
<option value="U">U<br /></option>
<option value="I">I<br /></option>
<option value="O">O<br /></option>
<option value="P">P<br /></option>
</select><br />
</td>
<td><br /></td>
<td rowspan="7">
<select name="choix[]" id="choix" style="width: 210px;" size="16" multiple="multiple" OnDblClick="javascript: deplacer( this.form.choix, this.form.dispo );">
</select><br />
</td>
<td><br /></td>
</tr>
<tr>
<td><br /></td>
<td><input type="button" value="ajouter >" OnClick="javascript: deplacer( this.form.dispo, this.form.choix );" /><br /></td>
<td rowspan="2"><input type="button" value="Monter" OnClick="javascript: deplacer_hautbas( this.form.choix, -1 );" /><br /></td>
</tr>
<tr>
<td><br /></td>
<td><input type="button" value="ajouter tout >>" OnClick="javascript: deplacer_tout( this.form.dispo, this.form.choix );" /><br /></td>
</tr>
<tr>
<td><br /></td>
<td><br /></td>
<td><br /></td>
</tr>
<tr>
<td><br /></td>
<td><input type="button" value="< retirer" OnClick="javascript: deplacer( this.form.choix, this.form.dispo );" /><br /></td>
<td rowspan="2"><input type="button" value="Descendre" OnClick="javascript: deplacer_hautbas( this.form.choix, 1 );" /><br /></td>
</tr>
<tr>
<td><br /></td>
<td><input type="button" value="<< retirer tout" OnClick="javascript: deplacer_tout( this.form.choix, this.form.dispo );" /><br /></td>
</tr>
<tr>
<td><br /></td>
<td><br /></td>
<td><br /></td>
</tr>
</table>
<br />
<input type="submit" value="OK" /> <input type="reset" value="Annuler" /><br />
</form>
c) Exemple
> Et voici le rendu de ce code :