DKS.CompactAccessibleForms: Pour des formes accessibles et compactes avec Mootools

Publié le 27 Juin 2007 par snoza

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 :

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 :

Voici la liste des options :

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.

Labels

Syndication

Folksonomie

Il y a 0 commentaires pour cet article

La discussion est ouverte, vous pouvez lire ou ajouter votre commentaire »