DKS.CompactAccessibleForms: Pour des formes accessibles et compactes avec Mootools
Mise à jour (2007-07-01): Suite à un commentaire sur les forums de mootools, j’ai décidé d’implémenter une nouvelle option qui permet l’utilisation de l’attribut placeholder des balises input. Puisque cet attribut est propriétaire à Safari, le comportement demeure inchangé lorsque l’usager n’utilise pas Safari. La version 1.0RC2 est maintenant disponible.
Mise à jour (2007-06-30): La version 1.0RC1 est maintenant disponible. Cette version corrige le papillotement sur Internet Explorer ainsi que le problème relié aux mots de passe sauvegardés puis ajoutés automatiquement aux champs password par Firefox.
DKS.CompactAccessibleForms est un plug-in qui permet d’afficher une forme accessible de façon plus compacte en superposant la balise label jumelée à un champ texte au-dessus de celui-ci ayant pour effet d’être à l’intérieur du champ. La balise label disparaitra lorsque l’utilisateur cliquera à l’intérieur du champ afin d’amorcer la saisie.
Inspiré d’un article trouvé dans les archives d’A List Apart, le script est une réadaptation complète, ala mootools, qui ajoute quelques options et améliorations en plus de corriger certaines problématiques du script original :
- Aucun papillotement.
Corrigé sur tous les fureteurs à l’exception d’Internet Explorer du fait que l’on ne peut pas accéder à la valeur d’un champ texte (attribuée côté serveur via l’attribut value) avant que l’événement onDomReady soit lancé. - Offre plus de flexibilité quant aux choix des noms de classes CSS qui seront attribués aux contrôles.
- Offre plus de flexibilité quant aux contrôles auxquels les classes CSS seront attribuées.
- Permets d’initialiser plusieurs formes en une seule ligne de code.
- Supporte l’attribut “placeholder” des éléments input (propriétaire à Safari).
Une page d’exemples est offerte (anglaise seulement pour l’instant). Si le comportement convient à vos besoins, la suite de l’article vous expliquera comment implémenter le plug-in sur les formes de votre site.
Dépendances et Pré-requis
Ce plug-in requiert mootools 1.11 (aussi disponible dans la section téléchargement du projet hébergé sur googlecode).
Ce plug-in s’adresse qu’aux formes accessibles, donc, il est impératif que chaque champ de saisie soit jumelé à une balise label.
Le script
var DKS = {}; DKS.CompactAccessibleForms = new Class({ options: { targetLabelClassName: "compactTarget", visibleLabelClassName: "compactVisible", hiddenLabelClassName: "compactHidden", updateInputClass: false, visibleInputClassName: null, hiddenInputClassName: null }, initialize: function(els, options){ this.setOptions(options); // Setting defaults for input visible/hidden CSS class names this.options.visibleInputClassName = this.options.visibleInputClassName || this.options.visibleLabelClassName; this.options.hiddenInputClassName = this.options.hiddenInputClassName || this.options.hiddenLabelClassName; if ($type(els) == 'array') { els.each(function(el){ this.attachEvents(el); }.bind(this)); } else if ($type($(els)) == 'element') { this.attachEvents($(els)); } else { return; }; },//end initialize attachEvents: function(container){ // Set focus and blur handlers to hide and show LABELs with options.targetClassName class names var labels = container.getElements('label.' + this.options.targetLabelClassName); labels.each(function(el){ // Skip labels that do not have a named association with another field. if (input = $(el.getProperty('for'))) { // Setting initialized class names el.switchClass(this.options.targetLabelClassName, this.options.hiddenLabelClassName); window.addEvent('domready', this.setInitializeElementsClass.pass([el, input], this)); // Set handlers to show and hide labels. input.addEvents({ focus: function(event){this.onFocusChanged(event, el);}.bind(this), blur: function(event){this.onFocusChanged(event, el);}.bind(this) }); // Handle clicks to LABEL elements (for Safari). el.addEvent('click', function(){this.focus;}.bind(input)); }; }.bind(this)); },//end attachEvents setInitializeElementsClass: function(label, input){ // Adding class to input (optional, but both needs to be defined...) if (this.options.updateInputClass) { input.addClass((input.value == '') ? this.options.visibleInputClassName: this.options.hiddenInputClassName); }; // Switch hidden class to init class (visible/hidden) depending on the initial value label.switchClass(this.options.hiddenLabelClassName, (input.value == '') ? this.options.visibleLabelClassName: this.options.hiddenLabelClassName); },//end setInitializeElementsClass onFocusChanged: function(event, label){ var event = new Event(event); this.toggleVisibility((event.type == 'focus' || event.target.value != ''), label, event.target); },//end onFocusChanged toggleVisibility: function(hide, label, input) { // Updating label class this.switchElementClass(label, hide, this.options.visibleLabelClassName, this.options.hiddenLabelClassName); // Updating input class if (this.options.updateInputClass) { this.switchElementClass(input, hide, this.options.visibleInputClassName, this.options.hiddenInputClassName); }; },//end toggleVisibility switchElementClass: function(el, hide, visibleClassName, hiddenClassname){ var addClassName = hide ? hiddenClassname: visibleClassName; var remClassName = hide ? visibleClassName: hiddenClassname; el.switchClass(remClassName, addClassName); }//end toggleClass }); DKS.CompactAccessibleForms.implement(new Options); Element.extend({ switchClass: function(targetClassName, switchWithClassName){ if(this.hasClass(targetClassName)) {this.removeClass(targetClassName);}; if(!this.hasClass(switchWithClassName)) {this.addClass(switchWithClassName);}; } });
Vous trouverez la version courante ainsi que la révision courante (en dévelopement) sur le référentiel Subversion de googlecode.
Paramètres et options d’initialisation
Seul un paramètre est requis, soit le ou les éléments contenant les paires de balises label/input à traiter. Voici la liste des paramètres du constructeur de la classe :
- els – requis, l’élément ou un tableau d’éléments contenant les paires de balises label/input (généralement, la/les forme(s) ou la/les balise(s) fieldset). Peut être : [l’ID de l’élément (string) | sélecteur CSS (string) | élément mootools ($(‘id’)) | tableau d’éléments mootools ($$(‘sélecteur css’))].
- options – optionnel, voir la liste des options ci-dessous.
Voici la liste des options :
- targetLabelClassName – string, nom de la classe CSS appliqué aux balises label qui doivent être traitées par le plug-in. Cette classe sera retirée de l’élément lors du traitement. Valeur par défaut : “compactTarget”.
- visibleLabelClassName – string, nom de la classe CSS qui sera appliquée aux balises label lorsque celles-ci doivent être visibles. Valeur par défaut : “compactVisible”.
- hiddenLabelClassName – string, nom de la classe CSS qui sera appliquée aux balises label lorsque celles-ci doivent êtres cachées. Valeur par défaut : “compactHidden”.
- updateInputClass – boolean, indique si une classe CSS sera aussi attribuée au champ texte jumelé à la balise label. Valeur par défaut : faux.
- visibleInputClassName – string, nom de la classe CSS qui sera appliquée aux champs textes lorsque ceux-ci doivent être visibles (lorsqu’updateInputClass est vrai). Valeur par défaut : valeur définie pour visibleLabelClassName.
- hiddenInputClassName – string, nom de la classe CSS qui sera appliquée aux champs textes lorsque ceux-ci doivent être cachés (lorsqu’updateInputClass est vrai). Valeur par défaut : valeur définie pour hiddenLabelClassName.
- usePlaceholderAttr – boolean, indique si l’attribut “placeholder”, propriétaire à Safari, doit être utilisé. Valeur par défaut : faux.
Utilisation
Voici un exemple d’utilisation simple, pour une série d’exemples supplémentaires, référez-vous au code source de la page d’exemples.
<form action="index.html" id="compactform"> <fieldset> <legend>Example 1: Login</legend> <ol> <li><label class="compactTarget" for="username">Username</label> <input name="username" type="text" id="username" /></li> <li><label class="compactTarget" for="password">Password</label> <input name="password" type="password" id="password" /></li> <li><input type="button" value="Login" /></li> </ol> </fieldset> </form> <script type="text/javascript"> new DKS.CompactAccessibleForms('compactform'); </script>
Veuillez noter que tout ce joue dans les classes de style CSS. Puisque chaque mise en pages est unique, il serait difficile de créer une solution qui conviendrait à tous out of the box. Étudiez les styles définis sur la page d’exemples et adaptez-les à votre site.
Il y a 0 commentaires pour cet article
La discussion est ouverte, vous pouvez lire ou ajouter votre commentaire »