Cours de JavaScript - Initiation à la création de plugins jQuery

version 1.0.0, dernière mise à jour le 12 janvier 2012.

   

Table des matières (TdM)

  1. I. Introduction
    1. Principe des plugins
  1. II. Construction pas à pas d'un plugin
    1. Introduction
    2. Pour bien commencer
      1. Structure de base
      2. Utilisation de this
    3. Les bases
    4. Permettre l'utilisation du plugin dans une chaîne de commandes jQuery
    5. Passer des options: le paramétrage et les options par défaut
    6. Exercice : Création d'un plugin

Retour au menu

Contenu du cours

I. Introduction

1. Principe des plugins

jQuery est une bibliothèque facilitant la création de code JavaScript portable, et facile à lire. Mais son intérêt ne se limite pas à cela : ses concepteurs ont élaboré un mécanisme permettant de compléter la bibliothèque. Il existe un répertoire « ,officiel » des plugins, mais de nombreux autres peuvent être trouvés sur le Web.

>Retour à la TdM

II. Construction pas à pas d'un plugin

1. Introduction

Une présentation plus complète, en anglais, peut être trouvée sur le site officiel sur une page intitulée Plugins/Authoring, qui détaille la manière « canonique » de conception d'un plugin, qui se retrouve dans la plupart de ceux qui existent. Nous ne passerons pas en revue dans ce cours d'introduction tout ce qui y est exposé, mais seulement le début en nous arrêtant au paramétrage du plugin, en construisant un plugin élémentaire pas à pas.

>Retour à la TdM

2. Pour bien commencer

a. Structure de base

On crée un plugin en étendant la fonction $. Pour cela, on écrit...

(function( $ )
{
  $.fn.monPlugin = function()  {
    //Code du plugin
  } ;
})(jQuery) ;

b. Utilisation de this

D'habitude avec jQuery, pour faire référence à l'objet jQuery courant on utilise $(this) (this renvoie en effet d'habitude l'objet du DOM). Cependant, le fait que le code du plugin sera appliqué à un objet jQuery fait qu'il n'est pas nécessaire de prendre cette précaution, et on peut écrire directement this.

>Retour à la TdM

3. Les bases

Il suffit ensuite d'écrire le code du plugin. Analysons par exemple ceci :

(function( $ )
{
  $.fn.metEnGras = function(e)  {
    this.html("<b>"+$(this).text()+"</b>") ;

    e.stopPropagation() ;
  } ;
})(jQuery) ;

Ce code remplace le contenu de l'élément auquel le plugin est appliqué. Il prend un paramètre e, qui sera en fait un objet de type événement jQuery. On en a besoin afin d'arrêter sa propagation vers le haut du DOM et ainsi éviter que, de proche en proche, les remplacements de code HTML ne finissent par remplacer l'élément body lui-même. Après l'avoir chargé, on l'applique dans le fichier HTML à un objet jQuery :

$(document).ready(hop) ;

function hop()  {
    $("p,i").click(testP) ;
  }

function testP(evt)  {
    $(this).metEnGras(evt) ;
  }

Ainsi qu'on peut le constater, le plugin s'applique comme n'importe quelle fonction jQuery, directement à un objet jQuery renvoyé par la fonction $. Pour un test grandeur nature, vous pouvez consulter cet exemple HTML de mise en œuvre du plugin, ainsi que ce premier plugin lui-même.

>Retour à la TdM

4. Permettre l'utilisation du plugin dans une chaîne de commandes jQuery

Un des atouts de jQuery est la possibilité de constituer une chaîne de commandes, par exemple $("p").addClass("rouge").slideToggle() afin de pouvoir les appliquer successivement à un objet jQuery. À cet effet, chaque fonction retourne elle-même un objet jQuery (un peu comme si on écrivait une suite de commandes Unix en ligne, séparées par plusieurs caractères |). Afin de préserver cette capacité, il faut faire en sorte que le plugin que l'on crée retourne un objet jQuery. Or un objet jQuery est créé de la même manière que nous l'avons fait précédemment. Notre plugin doit donc retourner une fonction. De plus, comme a priori il peut s'insérer dans une chaîne traitant une collection de nœuds, il faut s'assurer que la fonction est retournée pour chacun des nœuds de la collection. On obtient donc :

(function( $ )
{
  $.fn.metEnGras = function(e)  {
    return this.each(function()    {
      this.html("<b>"+$(this).text()+"</b>") ;

      e.stopPropagation() ;
    })
  } ;
})(jQuery) ;

On peut alors tester la chaîne sur ce fichier HTML, avec le plugin associé.

>Retour à la TdM

5. Passer des options: le paramétrage et les options par défaut

La plupart du temps, le fonctionnement d'un plugin peut être personnalisé à l'aide de paramètres. Il est souvent utile de préciser un lot d'options pour le plugin, avec des valeurs définies par défaut. Ces options sont spécifiées dans un littéral objet qui va « étendre x le jeu d'options par défaut :

(function( $ )
{
  $.fn.metEnGras = function(e, options)
  var settings = $.extend(    {
      balise:"b",
      classe:""
    }, options) ;

  {
    return this.each(function()    {
      this.html("<"+settings.balise+">"+$(this).text()+"</"+settings.balise+">") ;

      if (settings.classe!="") $(this).addClass(settings.classe) ;

      e.stopPropagation() ;
    })
  } ;
})(jQuery) ;

On peut alors tout à fait insérer l'appel au plugin dans une chaîne, et lui passer des options sous la forme d'un objet littéral : $(this).metEnGras(evt,{balise:"strong",classe:"souligne"}).addClass("rouge");. Les options sont facultatives. Si on écrit $(this).metEnGras(evt,{balise:"strong"}).addClass("rouge");, au lieu d'insérer une balise <b>, le plugin insérera <strong>.

>Retour à la TdM

Exercice 1. Création d'un plugin

Énoncé
Correction (Correction du code jQuery de départ)
Correction (Plugin de base)
Correction (Page HTML appelant le plugin de base)
Correction (Plugin pouvant s'insérer dans une chaîne)
Correction (Page HTML appelant le plugin s'insérant dans une chaîne)
Correction (Plugin avec options)
Correction (Page HTML appelant le plugin avec options)

Historique de ce document

Conditions d'utilisation et licence

Creative Commons License
Cette création est mise à disposition par Gilles Chagnon sous un contrat Creative Commons.

Retour au menu