IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

jQuery Discussion :

Plugin JQuery : créer un setter?


Sujet :

jQuery

  1. #1
    Membre confirmé Avatar de Soobook
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Réunion

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 98
    Par défaut Plugin JQuery : créer un setter?
    Bonjour à tous.

    J'ai créé un plugin JQuery, voici le code réduit au minimum :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    (function($) {
        $.fn.myPlugin = function(param, value) {
            //On récupère les paramètres.
            var params = {
                click : false            
            }
            if ($.isPlainObject(param)) {
                params = $.extend(params, param);
            } else if(param == "click" && typeof value == 'function'){
                params.click = value;
            }
     
            //On parcourt les noeuds.
            this.each(function() {
                //Action du click :
                $(this).click(function() {
                    if (params.click && typeof(params.click) == "function" ) {
                        params.click.call();
                    }
                });
            });
     
            //Chaînage JQuery.
            return this;
        };
    })(jQuery);
    Et un exemple de la manière dont je souhaite l'utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $(document).ready(function() {
        $("a").myPlugin({
            click:function() {
                alert("!");
            }
        });
        $("a.test").myPlugin("click", function() {
            alert("test");
        });
    });
    Mon problème est que je n'arrive pas à modifier mon paramètre une fois que l'objet a été instancié : dans l'exemple ci-dessus, cliquer sur "a.test" m'affichera "!" et non "test".

    Il y a un truc que je n'ai pas compris, manifestement! Si quelqu’un peut me mettre sur la voie, ce serait super cool.
    J'ai pas trouvé grand chose sur le sujet sur le net.

    Merci d'avance.

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Ben regarde juste comment tu appelles tes deux exemples...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $("a.test").myPlugin("click", function() {
        alert("test");
    });
    dans ce cas, que va renvoyer selon toi le test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($.isPlainObject(param))
    si param vaut "click" ?
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Membre confirmé Avatar de Soobook
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Réunion

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 98
    Par défaut
    Euhhhhhhh... je me suis trompé (je l'ai édité pour corriger). Dans mon plugin non allégé, j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //...
     else if(param == "click" && typeof value == 'function'){
                params.click = value;
            }
    Dans mon exemple, param vaut "click", donc c'est une chaine.

    Si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    alert($.isPlainObject("click"));
    J'obtiens "false", il devrait donc assigner "value" à "params.click", non???

    J'comprend plus...

  4. #4
    Membre chevronné Avatar de nadox
    Homme Profil pro
    Développeur
    Inscrit en
    Février 2010
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2010
    Messages : 360
    Par défaut
    Bonjour,

    En testant l'exemple, j'ai deux alert sur le lien 'a.test'.
    Celui avec le "!" et celui avec le "test"...

    Rien d'étonnant, puisque les évènements sont surement attachés "proprement".

  5. #5
    Membre confirmé Avatar de Soobook
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Réunion

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 98
    Par défaut
    En effet.
    J'ai l'impression que je me suis un emmêlé les pinceaux tout seul.

    Nadox, que veux-tu dire par "attachés proprement"?

    Du coup, j'utilise 'unbind' juste avant de créer l'évènement click et j'obtiens l'effet que je souhaite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    this.each(function() {
        //Action du click :
        $(this).unbind('click').click(function() {
            if (params.click && typeof(params.click) == "function" ) {
                params.click.call();
            }
        });
    });
    Juste pour être sûr, est-ce une bonne manière de procéder? Et après je met le Résolu.

    -------------------------------------------------------------------------

    Après plus de recherche, il me semble bien que c'est ce qu'il faut faire (cf. ce sujet).

    Du coup voici le code final :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    (function($) {
        $.fn.myPlugin = function(param, value) {
            //On récupère les paramètres.
            var params = {
                click : false            
            }
            if ($.isPlainObject(param)) {
                params = $.extend(params, param);
            } else if(param == "click"){
                //J'ai retiré "&& typeof value == 'function'" => si mon paramètre n'est 
                //pas une fonction, je supprime la fonction affectée au clic.
                params.click = value;
            }
     
            //On parcourt les noeuds.
            this.each(function() {
                //Action du click :
                $(this).unbind("click.mon_plugin").bind("click.mon_plugin", function() {
                    if (params.click && typeof(params.click) == "function" ) {
                        params.click.call();
                    }
                });
            });
     
            //Chaînage JQuery.
            return this;
        };
    })(jQuery);
    Merci à tous pour vos remarques .
    J'en suis moins bête, donc plus intelligent!!!

  6. #6
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    Voilà ! il fallait juste le traiter à l'irlandaise ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  7. #7
    Membre confirmé Avatar de Soobook
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Réunion

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 98
    Par défaut
    A l'irlandaise? Un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $(this).unbind("drink.water").bind("drink.whisky", function() {
        if($(this).happy()){
            $(this).removeKilt();
        }else{
            $(this).kickInTheTeeth(".english_people");
        }
    });

  8. #8
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    ben non c'est pas un setter Irlandais que tu veux ?
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  9. #9
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    hormis pour la dernière ligne ton code comporte quelques erreurs de syntaxes et d'ethique ..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $(this).unbind("drink.water").bind("drink.whisky", function() {
    n'est pas correct
    c'est drink.whiskey ... l'autre version étant écossaise...

    de même pour

    le kilt n'est pas interprété correctement par la version irlandaise, c'est une méthode de la version écossaise
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  10. #10
    Membre confirmé Avatar de Soobook
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Réunion

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 98
    Par défaut
    J'avoue que je n'avais pas compris pour l'animal! Et que l'ajax d'outre manche est trop subtil pour mes grosses pattes de franchouillard.

    En tout cas je m'incline devant ta science des celtes et autres barbares!!!

  11. #11
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    Le barbare te salue bien bas
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  12. #12
    Membre confirmé Avatar de Soobook
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Réunion

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 98
    Par défaut
    Quand je disais franchouillard...

    Je m'auto-flagelle soixante-dix sept fois pour ce manque de tact!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/05/2013, 21h56
  2. Réponses: 4
    Dernier message: 20/01/2012, 19h46
  3. Plugin pour créer des Etats
    Par gnaoui_9999 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 23/10/2006, 14h48
  4. [Menu Plugin Eclipse]créer un menu et utiliser ActionFactory
    Par Nanoulov dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 01/07/2005, 13h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo