Cet article va présenter la création d'un plugin pour jQuery en réalisant un widget de liste déroulante personnalisée. Il est
conseillé d'être déjà à l'aise avec l'utilisation de jQuery pour aborder cet article.
Un plugin jQuery est un ensemble de fonctions que l'on va rajouter à l'espace de noms de jQuery de manière à
enrichir les possibilités du framework. De nombreux plugins existent déjà (la page des plugins jQuery), qu'il s'agisse de créer de nouveaux widgets, de rajouter
des fonctions aux opérations de base de jQuery ou de créer de nouveaux comportements. Un plugin est avant tout une fonction qui
sera appelable sur un objet jQuery, il sera composé d'une fonction publique et de plusieurs fonctions privées incluses dans la
fonction publique.
Dans sa structure, jQuery est fait pour que tout le monde puisse y rajouter facilement des plugins. Un espace de
noms est dédié aux plugins : $.fn. Chaque plugin que vous rajouterez est censé se trouver à cet endroit.
En créant du contenu dans $.fn.exemple(paramètres), votre plugin sera appelable directement par jQuery.exemple(paramètres). Un plugin
sera appliqué sur un objet jQuery, provenant par exemple d'une recherche dans le DOM de la page et possèdera des paramètres,
indiqués par le développeur.
II. Création d'un plugin
II-1. Lancement
Pour créer un plugin il suffit en théorie de créer une fonction dans $.fn. On peut considérer cette fonction comme le
constructeur de votre plugin, récupérant tous les paramètres et faisant le traitement propre au plugin, positionnant les évènements, etc.
Ce code lancera 2 fois le plugin exemple, une fois sur chaque élément div.
On pensera à toujours renvoyer un objet jQuery de manière à conserver une interface fluide.
II-2. Paramètres
Les paramètres sont faits pour être passés sous forme JSON, celà offre entre autres la possibilité de définir
des paramètres facultatifs. Le principe est de définir un jeu de paramètres par défaut. jQuery prendra ces paramètres lorsqu'ils
ne seront pas définis dans l'entrée JSON.
La fonction $.extend se charge de récupérer les paramètres par défaut si ces paramètres ne sont pas fournis à la fonction.
En passant "options" à notre fonction de plugin, puis en récupérant les paramètres effectifs via $.extend, on obtient un second jeu de paramètres noté
opts dans le code. C'est ce jeu de paramètres qu'il conviendra d'utiliser tout au long de notre plugin.
III. Réalisation d'une liste déroulante personnalisée
Je choisis de me baser sur une liste HTML composée de balises ul et li puis de la transformer en une liste déroulante composée
d'une zone affichant l'option sélectionnée puis d'une zone dite déroulante proposant toutes les options de la liste.
Le plugin s'appellera directement sur les éléments ul : $("ul").customDropDown(); L'utilisateur pourra paramétrer le texte
affiché à la création de la liste, quand aucune option n'est encore sélectionnée, ainsi qu'une fonction personnalisée à appeler à
chaque sélection d'option. Ces 2 paramètres sont notés title et selectEvent.
Nous ne savons pas sur combien d'objets jQuery le plugin sera appelé, il faudra donc penser en premier lieu à séparer
tous les éléments <ul> pour créer une liste déroulante sur chacun.
Le principe de la transformation de la liste est le suivant
On crée une zone affichant l'option sélectionnée.
On crée une zone contenant tous les éléments <li> de la liste.
On positionne un évènement clic sur chaque élément sélectionnable de manière à le reporter dans la première zone.
On met en place un attribut value permettant de récupérer simplement l'option choisie.
Si vous placez une telle liste déroulante dans un formulaire, sa valeur ne sera pas envoyée lors de la soumission
du formulaire. Pour cela vous allez devoir créer un élément <input type="hidden"/> avec la valeur de l'élément sélectionné.
Le clic sur la première zone servira à dérouler et enrouler la liste selon qu'elle est déjà déroulée ou non. Nous aurons besoin
de stocker un booléen représentant cet état. J'ai choisi de le stocker dans $.data. Notez qu'on aurait pu stocker cette information
directement dans le DOM mais le stockage dans une structure de données découplée du DOM est plus propre.
L'attribut value des éléments <li> sera repris dans la zone personnalisée, il conviendra donc de penser à le renseigner.
III-2. CSS
Aucun style n'est défini dans le plugin, uniquement des classes CSS : dropdownCell, dropdownPanel, dropdownOpt et
dropdownOptSelected. Voici un exemple de style qui ne rend pas trop mal :