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 :

Portée variables, objets dans jQuery


Sujet :

jQuery

  1. #1
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Août 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2010
    Messages : 15
    Points : 16
    Points
    16
    Par défaut Portée variables, objets dans jQuery
    Bonjour,

    je planche depuis quelques jours sur une question de variable privée à l'intérieur d'un plugin jQuery.

    Avant d'aller plus loin, voici mon code test :
    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
    34
    35
    36
    37
    38
    39
    40
    41
     
    /* PLUGINNAME */
    (function($){
    	$.fn.test = function(options){
    		var opts = $.extend({},$.fn.test.defaults,options);
     
    		return this.each(function(){
    			init($(this));
    			opts.callback();
    		});
     
    		function init(obj){
    			var ref = obj;
     
    			var o = $.meta ? $.extend({}, opts, obj.data()) : opts;
    			o.param = obj.text();
    			console.log(o.param+' : '+ref.text());
    			// me renvoi bien "instance 1" puis "instance 2"
     
    			obj.append('<a class="testeur" href="#" title="click test">click test</a>');
    			obj.children('.testeur').each(function(){
    				$(this).click(function(e){
    					e.preventDefault();
    					testeur(ref,o);
    				});
    			});
    		}
    		function testeur(obj,o){
    			alert(obj.text());
    			alert(o.param);	// renvoi systématiquement "instance 2" (???)
    		}
    	};
    	$.fn.test.defaults = {
    		param : '',
    		callback : function(){}
    	};
    })(jQuery);
    /* /PLUGINNAME */
    $(function(){
    	$('.test').test();
    });
    et la structure HTML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <div id="instance1" class="test">
    	instance 1
    </div>
    <div id="instance2" class="test">
    	instance 2
    </div>
    Le problème est qu'au moment du second alert, je ne reçoit que "instance 2".
    ...alors que je veux désespérément avoir "instance 1" pour le premier et "instance 2" pour le second.

    Quelqu'un pourrait éclairer ma lanterne ?
    Plus j'y pense et plus je me dis que je m'y prend mal... mais ma matière grise frise... ^^'

    Un grand merci d'avance parce que je sèche vraiment là... ^^

    [Monkey Monk]
    That's all folks !

  2. #2
    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 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 644
    Points : 66 671
    Points
    66 671
    Billets dans le blog
    1
    Par défaut
    rattache la variable à this ou a window ...

  3. #3
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Août 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2010
    Messages : 15
    Points : 16
    Points
    16
    Par défaut
    Bonjour et merci pour la réponse rapide !

    Donc si je comprend bien tu me suggères de faire comme ceci ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    return this.each(function(){
    	$(this).o = $.meta ? $.extend({}, opts, obj.data()) : opts;
     
    	init($(this));
    	opts.callback();
    });
    Je n'ai pas l'occasion d'essayer tout de suite mais je profite de 3min pour grappiller des infos ! ^^

    Merci !

  4. #4
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Août 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2010
    Messages : 15
    Points : 16
    Points
    16
    Par défaut 'ai fini ! :)
    Ok... alors ma solution est d'un bête... comment n'y ai-je pas pensé avant ?

    L'utilisation de .data() permet d'ajouter mes params à mon objet jQuery courant.

    Donc :
    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
     
    return this.each(function(){
    	$(this).data(opts);
    	init($(this));
    	opts.callback();
    });
    function init(obj){
    	obj.data(opts).param = obj.text();
     
    	obj.append('<span class="testeur">click test</span>');
    	obj.children('.testeur').click(function(e){
    		e.preventDefault();
    		testeur(obj);
    	});
    }
    function testeur(obj,o){
    	alert(obj.text());
    	alert(obj.data(opts).param);
    }
    Et merci SpaceFrog ! C'est toi qui m'a remis les idées en place !

  5. #5
    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 937
    Points
    22 937
    Billets dans le blog
    125
    Par défaut
    Bonjour

    Citation Envoyé par monkey_monk Voir le message
    Plus j'y pense et plus je me dis que je m'y prend mal... mais ma matière grise frise... ^^'
    Si je me base sur le code fourni dans votre message, le stockage de paramètres n'est pas indispensable :

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    <script>
    	(function($){
    		$.fn.test = function(options){
    			var opts = $.extend({},$.fn.test.defaults,options);
     
    			return this.each(function(i, item){
    				var str = $.trim($(item).text());
     
    				$("<a\>",{
    					'class': "testeur",
    					href: "#",
    					title: "click test",
    					html: "click test",
    					click: function(e){
    						e.preventDefault();
    						testeur(item, str);
    					}
    				}).appendTo(item);
     
    				opts.callback();
    			});
    		};
     
    		// param 1 : element du DOM
    		// param 2 : texte
    		function testeur(elem, texte){
    			var str = "elem = " + elem +
    					"\n\n$(elem).text() = " + $.trim($(elem).text()) +
    					"\n\ntexte = " + texte;
     
    			alert(str);
    		}
     
    		$.fn.test.defaults = {
    			callback: function(){}
    		};
    	})(jQuery);
     
    	$(function(){
    		$('.test').test();
    	});
    </script>
    Si toutefois le stockage de paramètres est indispensable pour d'autres usages :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $("<a\>",{
    	'class': "testeur",
    	href: "#",
    	title: "click test",
    	html: "click test",
    	click: function(e){
    		e.preventDefault();
    		testeur(item, str);
    	}
    }).data('test', {
    	parent: item,
    	texte: str
    }).appendTo(item);

  6. #6
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Août 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2010
    Messages : 15
    Points : 16
    Points
    16
    Par défaut
    Merci beaucoup pour ce complément d'info !
    Je ne connaissais pas non plus cette utilisation des attributs jQuery.

    Merci !

  7. #7
    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 937
    Points
    22 937
    Billets dans le blog
    125
    Par défaut
    Bonsoir

    Citation Envoyé par monkey_monk Voir le message
    Merci beaucoup pour ce complément d'info !
    Je ne connaissais pas non plus cette utilisation des attributs jQuery.

    Merci !
    Voir : Comment puis-je créer un nouvel élément du DOM ?

  8. #8
    Membre à l'essai
    Profil pro
    Développeur Web
    Inscrit en
    Août 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2010
    Messages : 15
    Points : 16
    Points
    16
    Par défaut
    Voir : Comment puis-je créer un nouvel élément du DOM ?
    Ohhh ! Génial, encore merci !

    Un nouveau trou noir dans mon emploi du temps !

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 30/01/2015, 17h22
  2. [Portée] Variable accessible dans tout le script
    Par Jéjé34 dans le forum Langage
    Réponses: 1
    Dernier message: 07/02/2014, 20h13
  3. [2012] Variable objet dans une tache de script
    Par Mric78 dans le forum SSIS
    Réponses: 4
    Dernier message: 20/07/2012, 11h02
  4. Réponses: 2
    Dernier message: 02/06/2006, 14h47
  5. portée des variables globales dans un fichier js
    Par crakazoid dans le forum Général JavaScript
    Réponses: 19
    Dernier message: 14/04/2006, 17h49

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