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 perso, appel une méthode par un string


Sujet :

jQuery

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 274
    Points : 114
    Points
    114
    Par défaut plugin perso, appel une méthode par un string
    Bonjour à tous,

    Je viens vers vous car je me lance dans la création de plugin perso, et à peine commencer voilà que je tombe sur un problème, voici mon problème :

    J'ai une variable contenant le nom d'une fonction(méthode) de mon plugin, mais impossible de l'appeler ou de l'exécuté, voici le bout de code (très simplifier mais qui ne fonctionne pas)

    javascript / jquery
    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
     
    (function($){
        // définition du plugin jQuery
        $.fn.checkin = function() { 
            // retourne true si vide, sinon false
            function isEmpty(v){ 
                return (v == "" || v == null || v == false) ? true : false; 
            }
            var action = "isEmpty";
     
            $(this).bind('blur', function(){
                // alert(action); => OK (affiche bien isEmpty)
                // alert(isEmpty($(this).val())); => OK (retourne true ou false);      
                alert($(this)[action]($(this).val())); 
            });
        };
    })(jQuery);
     
    $("#inputTest").checkin();
    HTML
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <input type="text" name="inputTest" id="inputTest" />
    Comme vous le voyez le code est très simpliste, et pourtant je suis pas foutu le faire fonctionner.

    après un multitude de recherche, j'ai vue que l'on pouvait appeler une fonction depuis un string en la plaçant entre accolade (ce que j'ai fait), j'ai essayer plusieur syntaxe : (avec les erreurs)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    this[action]("");      // this[action] is not a function
    $(this)[action]("");  // $(this)[action] is not a function
    window[action](""); // window[action] is not a function
    [action]("");           // ["isEmpty"] is not a function
    On constate que le seul moment ou il me retourne le nom de la fonction dans l'erreur est le dernier, sinon il garde action et non pas isEmpty

    Si j'appel directement la fonction, ça fonctionne, le alert(action) me retourne bien isEmpty

    Donc voilà je pense avoir expliquer la chose, si quelqu'un peut m'aider à résoudre ce problème, je l'en remercie d'avance.

    PS : ma version jQuery est : jquery-1.6.4

    D'avance merci

  2. #2
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Bonsoir

    C'est normal, isEmpty() est une fonction privée, connue à l'intérieur du plugin, ce n'est pas une méthode d'un objet.

    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
    30
    31
    32
    33
    (function($){
        $.fn.checkin = function(){
     
    		// isEmpty est une fonction privée pas une méthode d'un objet
            // retourne true si vide, sinon false
            function isEmpty(v){ 
                return (v == "" || v == null || v == false) ? true : false; 
            }
     
            var action = "isEmpty";
     
    		/*
    		 * On doit toujours retourner this qui, ici,
    		 * est un array d'objets jQuery
    		 */ 
    		return this.each(function(i, item){
    			/*
    			 * i est le numéro d'ordre et item est un des éléments
    			 * du DOM passé dans le sélecteur.
    			 * $(item) est l'équivalent d'un $(this)
    			 */
     
    			// on avec jQuery 1.7 et plus
    			$(item).on("blur", function(){
    				console.log( action ); // => OK (affiche bien isEmpty)
    				console.log( isEmpty( $(this).val() ) ); // => OK (retourne true ou false);
     
    				// Uncaught TypeError: Object [object Object] has no method 'isEmpty'
    				// console.log( $(this)[action]( $(this).val() ) ); 
    			});
    		});
        };
    })(jQuery);

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 274
    Points : 114
    Points
    114
    Par défaut
    Bonjour,

    Merci beaucoup pour votre réponse, mais le problème reste posé malheureusement, bien que je pensait que c'était bon.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    console.log( this[action]( $(this).val() ) ); // => PAS OK
    action est toujour en erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $(this)[action]   => action is not a function
    [action]('')        => isEmpty is not a function
    $[action]('')      => action is not a function
    this[action]('')   => action is not a function
    Le but étant de passer en paramètre une action (fonction à exécutée), mais toujours impossible à faire.

    Encore merci de votre aide

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 274
    Points : 114
    Points
    114
    Par défaut
    Alors voilà, j'ai sorti la fonction isEmpty du plugin, et du coup
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    window['action']('');
    Fonctionne, ça m'ennuie un peut car je vais devoir sortir toutes les fonctions susceptibles d'être appeler via la variable action alors qu'elle ne sont destiné qu'a ce plugin (l'impression que ça fait sortir ces fonctions de leur contexte d'utilisation) et de fait je pourrait les appeler directement sans devoir passer par le plugin.

    M'enfin on s'en contentera donc pour que ca fonction voici ma source :
    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
     
    // retourne true si vide, sinon false
    function isEmpty(v){ 
        return (v == "" || v == null || v == false) ? true : false; 
    }
     
    (function($){
        // définition du plugin jQuery
        $.fn.checkin = function(){
     
     
            var action = "isEmpty";
     
     
            $(this).bind("blur", function(){
                if( window[action]( $(this).val() ) ){ alert('VIDE'); }
            });
     
            return this;
        };
    })(jQuery);
    Donc voilà, je sais pas si je fait bien les choses, et votre avis est le bienvenue.

    Je laisse le sujet encore un peut en non résolut, de manière à avoir votre avis. je le mettrait en résolut très prochainement sinon

    Encore merci.

Discussions similaires

  1. Appeler une méthode par son nom sans utiliser eval
    Par rambc dans le forum Général Python
    Réponses: 5
    Dernier message: 30/10/2009, 16h05
  2. Réponses: 9
    Dernier message: 10/05/2007, 17h57
  3. Comment appeler une méthode dont le nom est dans un string?
    Par Ireon dans le forum API standards et tierces
    Réponses: 22
    Dernier message: 13/04/2007, 17h22
  4. Réponses: 3
    Dernier message: 05/10/2006, 18h52
  5. appeller une méthode dans le nom est dans un String
    Par fxjtarga dans le forum Langage
    Réponses: 2
    Dernier message: 24/02/2006, 16h06

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