1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<title>Select personnalisé</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<meta http-equiv="Content-type" content="application/xhtml+xml; charset=ISO-8859-1" />
<meta http-equiv="Content-Language" content="fr" />
<meta name="Author" content="Auteur - www.developpez.com" />
<script type="text/javascript">
<!--
var monSelect = function(nomSelect, options, objParent, multiple, coulSelec)
{
// variables publiques
this.tableau = null;
this.inputSelection = null;
// variables privées
var ligne, cellule, tabOp;
var i, j, n, m;
// nombre d'options de la liste
n = options.length;
//** création de la liste
// création du tableau
tableau = document.createElement("table");
// style du tableau
tableau.style.borderCollapse = "collapse";
tableau.style.cursor = "default";
tableau.style.margin = "2px";
for (i=0; i<n; i++)
{
// ajout d'une ligne
ligne = tableau.insertRow(-1);
// style de la ligne
ligne.style.border = "solid 2px #AAAAAA"; // sans effet sous IE ??
// contenu des champs (tout ce se trouve entre les balises <option> d'un select)
tabOp = options[i][1].split("|");
m = tabOp.length;
for (j=0; j<m; j++)
{
cellule = ligne.insertCell(j);
if (tabOp[j]!="")
cellule.innerHTML = tabOp[j];
else
cellule.innerHTML = " "; // FF n'aime pas les cellules vides ;)
// style des cellules
cellule.style.paddingLeft = "20px";
cellule.style.paddingRight = "20px";
cellule.style.paddingTop = "2px";
cellule.style.paddingBottom = "2px";
}
// valeur à transmettre (== à value de la balise <option value="data">)
// => pour la syntaxe, voir FAQ
ligne.optionSelect = options[i][0]; // on définit pour chaque ligne un attribut optionSelect
ligne.onclick = function(event)
{
var ev;
ev = (event?event:window.event); // POUR IE
surligner(this, ev, this.optionSelect);
}
}
// ajout du tableau dans l'objet parent
objParent.appendChild(tableau);
//****
//****
// création d'un input qui contiendra les valeurs des options sélectionnnées
try
{
// si une exception est levée, le contenu du catch est exécuté (voir FAQ)
inputSelection = document.createElement("<input name='"+nomSelect+"'>");
}
catch(erreur)
{
inputSelection = document.createElement("input");
inputSelection.name = nomSelect; // nom du champ
}
inputSelection.type = "hidden"; // champ caché
inputSelection.id = nomSelect; // id du champ
inputSelection.value = "";
// ajout de l'input créé dans le conteneur
objParent.appendChild(inputSelection);
//****
//*****************************************************
// actions à réaliser lorsqu'une ligne est sélectionnée
function surligner(ligne, ev, valeur)
{
var tabTR = tableau.getElementsByTagName("tr");
var ctrl = ev.ctrlKey; // appui sur la touche CTRL ?
var n, i;
n = tabTR.length;
if ((multiple && !ctrl) || !multiple)
{
for (i=0; i<n; i++)
{
// réinitilisation des couleurs de fond de chaque ligne
tabTR[i].style.backgroundColor = "";
tabTR[i].couleur = "";
}
inputSelection.value = ""; // réinitilisation de l'input
}
// modification du style de la ligne
if (!(ligne.couleur == coulSelec))
{
// ligne sélectionnée => on lui attribue la couleur de sélection
ligne.style.backgroundColor = coulSelec;
ligne.couleur = coulSelec; //variable nécessaire, pour le test ci-dessus
// ajout de la valeur à l'input : le ";" est le séparateur
inputSelection.value += valeur+";";
}
else
{
// ligne déselectionnée => réinitilisation de la couleur du fond
ligne.style.backgroundColor="";
ligne.couleur = "";
// on supprime de l'input la valeur correspondant à la ligne
// => on ne garde que les valeurs des lignes colorées
inputSelection.value = "";
for (i=0; i<n; i++)
{
if (tabTR[i].couleur==coulSelec)
{
//optionSelect a été définie lors de la création de chaque ligne du tableau
// le ";" est le séparateur des valeurs
inputSelection.value += tabTR[i].optionSelect+";";
}
}
}
}
}
monSelect.prototype =
{
// pour gérer le reset de la liste lors de l'événement onclick d'un bouton
// l'id du bouton est le paramètre de la fonction
resetMonSelect : function(idBtnReset)
{
var obj = this;
document.getElementById(idBtnReset).onclick = function(){obj.resetSelect()}
}
,
// fonction qui réinitialise le tableau
resetSelect : function()
{
var tabTR = tableau.getElementsByTagName("tr");
var n, i;
n = tabTR.length;
for (i=0; i<n; i++)
{
tabTR[i].style.backgroundColor = "";
tabTR[i].couleur = "";
}
inputSelection.value = "";
}
}
function initListe()
{
var objParent;
var s;
var optionsListe = new Array();
// Syntaxe des options :
// ["valeur de l'option (value)", "colonne_1|colonne_2|....|colonne_n"]
// bien vérifier que chaque option a le même nombre de colonnes !!
// chaque colonne est séparée par un |
optionsListe[0] = ["valeur_0","nom_0|prénom_0|adresse_0|ville_0"];
optionsListe[1] = ["valeur_1","nom_1|prénom_1|adresse_1|ville_1"];
optionsListe[2] = ["valeur_2","nom_2|||ville_2"];
optionsListe[3] = ["","nom_3|un long prénom_3|adresse_3|ville_3"];
optionsListe[4] = ["valeur_4","nom_4||adresse_4|ville_4"];
optionsListe[5] = ["valeur_5","nom_5|prénom_5|adresse_5|ville_5"];
optionsListe[6] = ["valeur_6","nom_6|prénom_6|une longue adresse_6|ville_6"];
optionsListe[7] = ["valeur_7","nom_7|prénom_7|adresse_7|ville_7"];
optionsListe[8] = ["valeur_8","nom_8|||ville_8"];
optionsListe[9] = ["valeur_9","un long nom_9| prénom_9|adresse_9|ville_9"];
// objet contenant la liste
objParent = document.getElementById("conteneur");
// création de la liste
// Syntaxe : new monSelect(nomSelect, options, objParent, multiple, coulSelec)
// nomSelect : id/nom du champ contenant les options sélectionnées
// options : tableau des options (cf. syntaxe ci-dessus)
// objParent : objet contenant le select
// multiple : true => select multiple ; false => select simple
// coulSelec : couleur de la sélection
s = new monSelect("maListe", optionsListe, objParent, true, "#AAAAFF");
// pour ajouter l'événement onclick sur un bouton permettant d'effacer les sélections
// l'id du bouton est le paramètre
s.resetMonSelect("idReset"); // pour gérer le reset de la sélection
}
//-->
</script>
</head>
<body onload="initListe()">
<form action="" id="formulaire">
<div id="conteneur" style="overflow:auto; height: 210px; width: 450px; border: inset 2px #AAAAAA">
<!-- div contenant la liste -->
</div>
<div>
<input type="submit" /> <input type="reset" id="idReset"/>
</div>
</form>
</body>
</html> |
Partager