Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript > Bibliothèques & Frameworks > jQuery
jQuery Forum d'entraide sur le framework jQuery. Avant de poster : Tutoriels jQuery, FAQ jQuery, Tous les tutoriels JavaScript, Toutes les FAQ JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/11/2011, 13h41   #1
Membre à l'essai
 
Inscription : novembre 2007
Messages : 88
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : novembre 2007
Messages : 88
Points : 23
Points : 23
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 :
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 :
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 :
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
splifferwolf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2011, 20h10   #2
Rédacteur
 
Avatar de danielhagnoul
 
Homme Daniel Hagnoul
Étudiant perpétuel
Inscription : février 2009
Messages : 3 221
Détails du profil
Informations personnelles :
Nom : Homme Daniel Hagnoul
Âge : 61
Localisation : Belgique

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

Informations forums :
Inscription : février 2009
Messages : 3 221
Points : 6 767
Points : 6 767
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 :
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);
__________________

FAQ jQuery

Mon cahier d’exercices sur jQuery & Co

Si un message vous a aidé ou vous semble pertinent, votez pour lui !
danielhagnoul est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2011, 12h31   #3
Membre à l'essai
 
Inscription : novembre 2007
Messages : 88
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : novembre 2007
Messages : 88
Points : 23
Points : 23
Bonjour,

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

Code :
1
2
 
console.log( this[action]( $(this).val() ) ); // => PAS OK
action est toujour en erreur

Code :
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
splifferwolf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2011, 13h17   #4
Membre à l'essai
 
Inscription : novembre 2007
Messages : 88
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : novembre 2007
Messages : 88
Points : 23
Points : 23
Alors voilà, j'ai sorti la fonction isEmpty du plugin, et du coup
Code :
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 :
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.
splifferwolf est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h38.


 
 
 
 
Partenaires

Hébergement Web