Accueil du site > Jquery > Jquery 1.4 , approche RIA , Quick Element Construction

Jquery 1.4 , approche RIA , Quick Element Construction

dimanche 24 janvier 2010, par fabrizio

"Quick Element Construction" sous se libellé est présenté dans les 14 jours de jquery une des évolutions de jquery 1.4. En lisant cet apport en début de semaine milles idées me sont venues !!! Et je ne résiste pas au plaisir de les partager avec vous car il s’agit plus d’une révolution que d’une évolution. En fait grâce à ce changement on peux mettre en place une approche , dite RIA .

Quick Element Construction

Concrètement voici le code que nous propose le site dédié a jquery :

jQuery("<div/>", {
    id: "foo",
    css: {
        height: "50px",
        width: "50px",
        color: "blue",
        backgroundColor: "#ccc"
    },
    click: function() {
       $(this).css("backgroundColor", "red");
    }
}).appendTo("body");

Il s’interprète de la manière suivante : On construit un élément de type ’div’ avec les caractéristiques suivantes , un id foo , un style défini dans CSS et un évènement click. Une fois construit on le rajoute dans le DOM au tag Body. Bien entendu cela n’apporte pas grand chose , en apparence ..... Mais en y regardant de plus près on se rend compte que pour construire les propriétés de cette div on utilise un objet javascript. Et là tout s’éclaire .... si j’utilise des objets javascript , je peux facilement en créer et je peux également très facilement les décliner. C’est ce que nous allons de suite voir dans un exemple.

Faire de la RIA avec Jquery 1.4

Je vous propose dans un premier temps de voir un exemple , et ensuite, de voir le code et son interprétation , qui vous allez voir est vraiment très simple. Vous n’avez besoin au final de connaître que jquery , même les bases sont suffisantes , et la notation objet de javascript. NB : pour cet exemple et pour rendre cela plus ’fun’ j’utilise également jquery ui mais son utilisation n’est pas indispensable. Et comme d’habitude vous pouvez télécharger l’exemple au format zip en bas de page. ( You can download the exemple of jquery RIA at the bottom of the page )

N’hésitez pas , cliquer sur les éléments , déplacez les 2 derniers et double cliquer sur le dernier !!!

Voila nos 5 boites ... la première et la boite original , les 3 suivantes étendent ou modifient les propriétés de celle ci. Enfin la dernière ( draggable explode fan )est une extension de celle juste avant. Quand on clik sur les 2 premières on swich sur la couleur de fond , la troisième n’apprécie pas que l’on click dessus , les deux dernières sont draggables et si vous double-cliquer sur la dernière , elle explose !!! Passons maintenant au code et à son explication.

Créer des composants , et les étendre

Le code est vraiment très long mais la partie script proprement dit et au final assez courte car il y a énormément de commentaires. Ces derniers sont d’ailleurs en Français et en Anglais. J’ai également mis des numéros en chiffre romain pour faire l’explication de celui ci.

- I : on montre les boites , rien de particulier ...

- II : Il s’agit de la boite original. Comparé au code de démo $("<div/>",box).appendTo("#demo") ; est identique. La seule différence c’est que nous passons cet objet en paramètres à jquery.

- III : c’est la partie la plus simple et ma foi la plus intéressante. Je crée un objet javascript (box_extension) qui contient d’autres objets, qui vont s’appuyer sur box . Par exemple ’fan’ est un objet qui surcharge une seule propriété de box , à savoir son text. Red fan , surcharge text et click mais il a aussi un groupe de propriétés en plus avec CSS. Cela va être une boite rouge ou on écrit plus gros. Draggable fan , lui surcharge plusieurs méthodes et rajoute notamment la méthode Mouse enter qui rend l’objet draggable. Enfin et c’est quand même bien intéressant Draggable explode va surcharger Draggable fan en rajoutant un évènement double click.

- IV : il est temps de créer réellement ces objets avec la fonction extend_component().

- V : extend_component(). est une fonction qui reçoit 2 paramètres. L’élément à étendre et son extension. J’utilise la fonction $.extend() de jquery pour fiare assez simplement cela. Concrètement quand j’écris var fan = extend_component(box , box_extension.fan ) ; fan va devenir un objet avec les attributs de box sauf si cela sont surchargés + les attributs spécifiques de box_extension.fan. Cela permet notamment d’étendre un composant déjà étendue , par exemple var draggable_explode = extend_component(draggable_fan , box_extension.draggable_explode ) ;

---I :  Montrer les boites  - Display the box ---
$(function(){
        /* on affiche les composants une fois la page chargee */
        /* we display the different box */
        $("<div/>", box).appendTo("#demo");
        $("<div/>", fan).appendTo("#demo");
        $("<div/>", red_fan).appendTo("#demo");
        $("<div/>", draggable_fan).appendTo("#demo");
        $("<div/>", draggable_explode).appendTo("#demo");
})
---II :  Objet boite original - Original Box object ---
/* notre boite mere , origine , matrice ... */
/* The original component have the class box , a text and one event 'click' registred */
var box = {
    class : "box",
    click: function() {
       $(this).toggleClass("background");
    },
    text : 'Hello world'
}
---III :  Les extensions de la boite - Extensions of the box ---
/* les différentes extensions de la boite ... */
/* box_extension have different extensions for the original component box*/
var box_extension = {
       
        /* un extension qui ne modifie que le texte */
        /* This extension modify only the text */
        fan : {text : 'I m Jquery fan'},
       
        /* une extension qui met la boite en rouge et qui vous avertit de ne pas la clicker */
        /* This extension  modify the text , the CSS and we override the click function */
        red_fan : {
                text : 'I m Jquery red fan',
                css : {
                        backgroundColor: "red",
                        fontSize : "150%"
                },
                click: function() {
                       alert("Don't click the red fan !!! " );
                  }
        },
       
        /* Votre boite a un joli border .. et vous pouvez la déplacer */
        /* This extension  modify the text , the CSS , we disable the click function and we make this
         box draggable using the event mouseenter */

        draggable_fan  : {
                text : 'I m Jquery draggable fan  , Drag me if you can',
                css : {
                        border : "3px green solid"
                },
                mouseenter : function(){
                        $(this).draggable();
                        $(this).unbind('mouseenter');
                },
                click: function() {
                        $(this).unbind('click');
                    return;
                 }
        },
       
        /* Cet element va etendre l'element draggable_fan*/
        /* We gone use this element to extend draggable_fan*/
        draggable_explode : {
                text : 'I m Jquery draggable explode fan  , Double click !!',
               
                dblclick : function(){
                 $(this).show("explode", { pieces: 16}, 2000);
                }
        }
       
}
---IV :  Création des composants - Building new component ---
/* on cree les nouveaux composants */
/* we buid your new component based on box , using the fonction extend_component */
var fan = extend_component(box , box_extension.fan );
var red_fan = extend_component(box , box_extension.red_fan );
var draggable_fan = extend_component(box , box_extension.draggable_fan );
/* Ici on cree un element qui a deja etendu box*/
/* draggable_explode will extend draggable_fan , it's interesting to have a variation of an extended model */
var draggable_explode = extend_component(draggable_fan , box_extension.draggable_explode );
---V :  fonction qui sert à étendre un composant - Extending function ---
/* fonction qui construit les nouveaux composant à partir d'un modele et d'une de ses extensions */
/* this fonction receive 2 parameters , the original model or a extended model( here box or draggable_fan) and
   the component extending the original one */

function extend_component(model , extend){
        var local = $.extend( true , {},  model );
        $.extend( true, local ,  extend );
        return local;
}

De l’intérêt d’utiliser des composants

Cette première démo vise simplement à faire découvrir une des possibilités offerte par la version 1.4 de jquery. Elle peux servir de base ou d’inspiration pour construire sa propre bibliothèques de composants. L’intérêt principal est de pouvoir simplement mettre en place des éléments dans le DOM et de pouvoir faire des variations très simplement.

Néanmoins nous ne sommes limités que par notre imagination et il ne tient qu’à nous de faire vivre un concept aussi novateur que riche. Par exemple nous pourrions développer d’autre méthodes que l’héritage en faisant de la composition. On pourrait également mettre en place des moyens plus simple pour désactiver une fonction comme le click sur l’élément étendu .

Un des autres intérêt est de pouvoir continuer à utiliser les avantages du trio HTML , CSS et javascript. Contrairement aux autres RIA, les styles et la mise en page sont beaucoup plus faciles à maitriser. Le fait de se construire une bibliothèque de composants par cette fonctionnalité de jquery donne une vertu supplémentaire au web. Il devient maintenant très facile de créer des composants , de les étendre et surtout de les exporter sur d’autres sites. Là vous n’avez qu’à créer des extensions pour pouvoir les adapter. Au final on pourra cumulé les avantages de l’approche des RIA en gardant la souplesse et la simplicité du web.

Conclusion : a vos claviers

Cette article essaye avant tout d’avoir une vertu pédagogique en exposant "Quick Element Construction" de jquery 1.4 . Il est certain que nous n’allons par tarder à voir débarquer sur le web les premières bibliothèques de composants. Jquery a crée par sa facilité et sa clarté une première révolution dans dans le web en démocratisant le javascript. Aujourd’hui il est est certain qu’une autre révolution est marche .... Camarades a vos claviers !!!!

Documents joints

5 Messages de forum

  • Petite question...

    var box = class : "box", click : function() $(this).toggleClass("background") ; , text : ’Hello world’ (pour le code voir l’article, dans les commentaires la mise en page est supprimée)

    C’est quoi le type de la variable box ? Comment ça s’appel cette structure qu’on déclare avec les crochets ? Et y’a un moyen de savoir par exemple si la variable box contient l’attribut text ou click ?

    Répondre à ce message

    • Jquery 1.4 , approche RIA , Quick Element Construction 24 janvier 2010 16:06, par fabrizio

      Box est une variable objet javascript. C’est une notation que tu retrouves régulièrement sur jquery , par exemple sur la fonction $.ajax() ; . Les éléments comme text , click ou autres sont des propriétés de l’objet. Qui peuvent être des entiers , des strings , des fonctions .... ou d’autres objets.

      Pour connaître si une propriété existe simplement dans ton code tu peux faire : if (box.text) faire ceci ou if (box.click) faire cela

      Répondre à ce message

      • Jquery 1.4 , approche RIA , Quick Element Construction 15 février 2010 01:55, par remrem

        Cher professeur fabrizio merci pour votre réponse ;)

        Néanmoins j’entrevois un petit soucis... si la propriété bidule est de type boolean, il devient du coup difficile de tester si la propriété bidule est déclarée ou si elle vaut true ?

        Il y a t’il la possibilité qu’il existasse un mot clé "defined", ou bien peut-on utiliser "instanceof" si on sait quelle doit être le type de la propriété ?

        Je suis très javascript en ce moment :) Merci d’avance professeur fabrizio !!

        Ps : si tu peux modifier le template de ton site, le lien "répondre à cet article" n’est pas très clair je trouve, un simple "laisser un commentaire" serait moins perturbant pour les esprits sensibles comme moua :)

        Répondre à ce message

        • Jquery 1.4 , approche RIA , Quick Element Construction 20 février 2010 15:23, par fabrizio

          Excellente remarque ... Qui m’a permis de voir un point intéressant. Pour répondre à ta question il y a un moyen pour tester si une propriété d’un objet existe même si elle vaut false.

          var obj = { is_boolean : false }

          function test(){ if (’is_boolean’ in obj) alert(’existe ’ + obj.is_boolean) ; }

          test() ;

          Répondre à ce message

  • J’aime beaucoup l’effet du dernier carré. J’ai certaine lacune avec jquery notamment dans la création de fonction, avez vous un tutoriel ?

    Fredj @ vitre teintée

    Répondre à ce message

Laisser un commentaire