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 16/11/2011, 15h15   #1
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 040
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

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

Informations forums :
Inscription : mars 2002
Messages : 30 040
Points : 45 141
Points : 45 141
Par défaut portée de this dans un .load()

Je me posais juste une question suite à un dépannage sur le chat :

Code :
$('.foo').load('page'+$(this).attr('id')+'.php')
ne fonctionne pas ..

Suis-je vraiment obligé de décomposer en Amont pour recupérer une variable dans le load ?
__________________
Ma page 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


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 15h34   #2
Membre actif
 
Avatar de eckerdecker
 
Inscription : décembre 2009
Messages : 132
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : décembre 2009
Messages : 132
Points : 154
Points : 154
Je ne saurai pas mettre les mots exacts mais ça me semble impératif oui, dans la mesure ou dans le cas suivant
Code :
1
2
3
$('.bar').click(function(){
  $('.foo').load('page'+$(this).attr('id')+'.php');
});
$(this) fait forcément référence au .bar cliqué.
Dans ton cas, sans contexte, this n'est rien.
Code :
1
2
3
$('.foo').each(function(){
  $(this).load('page'+$(this).attr('id')+'.php');
});
Serait la bonne méthode.
eckerdecker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 15h36   #3
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 040
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

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

Informations forums :
Inscription : mars 2002
Messages : 30 040
Points : 45 141
Points : 45 141
le each semblerait vouloir dire qu'un eq(0) ferait le taff ... mais non
Code :
1
2
3
4
 
$('.foo:eq(0)').load('page'+$(this).attr('id')+'.php')
//ou
$('.foo').eq(0).load('page'+$(this).attr('id')+'.php')
ça m'echappe
__________________
Ma page 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


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 15h44   #4
Membre actif
 
Avatar de eckerdecker
 
Inscription : décembre 2009
Messages : 132
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : décembre 2009
Messages : 132
Points : 154
Points : 154
Avec eq(0) la donne est différente, tu ne cible qu'un élément aussi tu es en mesure de savoir ce que tu veux et tu pourrais donc le faire ainsi :
Code :
$('.foo:eq(0)').load('page'+$('.foo:eq(0)').attr('id')+'.php')
Mais ce n'est pas le propos d'origine le problème, et je ne saurais pas comment l'expliquer, c'est que this ne vaut rien.
eckerdecker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 16h04   #5
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 040
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

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

Informations forums :
Inscription : mars 2002
Messages : 30 040
Points : 45 141
Points : 45 141
Citation:
et je ne saurais pas comment l'expliquer, c'est que this ne vaut rien.
C'est justement le propos de ma question ...

pourquoi le $(this) n'as pas la portée à laquelle je m'attendais dans un load() ?
__________________
Ma page 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


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 16h41   #6
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 807
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : juin 2008
Messages : 13 807
Points : 35 789
Points : 35 789
La méthode AJAX .load() n'est en fait qu'un raccourci de la méthode .ajax() avec des paramètres prédéfinis, lors de l'appel réel de la requête, la méthode (malgré sa syntaxe) ne s'applique pas à un élément jQuery, c'est une méthode globale
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, 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
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 16h45   #7
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 040
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

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

Informations forums :
Inscription : mars 2002
Messages : 30 040
Points : 45 141
Points : 45 141
Donc

Code :
1
2
3
me=$('.foo')
me_id=me.attr('id')
me.load('page'+me_id+'.php')
est incontournable ...

Merci Beef de cette explication...
__________________
Ma page 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


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 16h56   #8
Membre actif
 
Avatar de eckerdecker
 
Inscription : décembre 2009
Messages : 132
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : décembre 2009
Messages : 132
Points : 154
Points : 154
Mais ... le principe s'applique à d'autres méthodes non ?

Par exemple :
Code :
<img id="logo" src="logo.gif" class="fast" alt="logo"/>
et
Code :
$('#logo').fadeIn($(this).attr('class'));
ne fonctionnera pas ... non ?
De manière générale on ne peut pas utiliser $(this) pour se référer au sélecteur, me trompes-je ?
eckerdecker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 16h58   #9
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 040
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

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

Informations forums :
Inscription : mars 2002
Messages : 30 040
Points : 45 141
Points : 45 141
oui étant habitué à cette portée du this je m'étonnais qu'elle ne s'appliquât pas au load()
__________________
Ma page 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


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 17h13   #10
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 807
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : juin 2008
Messages : 13 807
Points : 35 789
Points : 35 789
Citation:
Envoyé par eckerdecker
Mais ... le principe s'applique à d'autres méthodes non ?

Par exemple :
Code :
<img id="logo" src="logo.gif" class="fast" alt="logo"/>
et
Code :
$('#logo').fadeIn($(this).attr('class'));
ne fonctionnera pas ... non ?
De manière générale on ne peut pas utiliser $(this) pour se référer au sélecteur, me trompes-je ?
En règle générale, dans chaque méthode appelée sur une collection jQuery, il est possible d'utiliser this pour référencer l'élément DOM en cours et $(this) pour référencer l'élément jQuery en cours.
Mais il existe certaines exceptions, dont celle soulevée par Spaffy.
Dans l'exemple que tu donnes, il s'agit d'une animation, la fonction exécutée à la fin de celle-ci est de type callback (ou fonction de rappel), lors de son exécution, la boucle qui a servi à la lancer étant terminée, il n'y a donc plus de référence à l'élément qui l'a appelée, donc this n'est plus disponible (du moins, sa valeur n'est plus celle attendue).
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, 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
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 10h27   #11
Membre actif
 
Avatar de eckerdecker
 
Inscription : décembre 2009
Messages : 132
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : décembre 2009
Messages : 132
Points : 154
Points : 154
Sauf qu'en l'occurence, bien que ça n'ait pas beaucoup de sens, je me réfère à la class de l'élément pour passer l'attribut duration (avec la valeur "fast"),
j'ai fais un petit Fiddle, pour tester, et je n'obtiens pas grand chose : http://jsfiddle.net/tP5pK/3/

Dans quel cas peut-on utiliser $(this) pour désigner le sélecteur en cours dans les paramètres mêmes d'une méthode appliquée à ce sélecteur (et pas dans un callback, là je sais qu'il n'y a pas de problème) ?

Je suis curieux de voir comment je pourrais utiliser cette "portée" je me le suis toujours interdit pensant que ça ne donnait rien, mais d'après ce que vous dites il semblerait que cela soit possible.
eckerdecker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 10h58   #12
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 807
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : juin 2008
Messages : 13 807
Points : 35 789
Points : 35 789
Un petit exemple :
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
<!DOCTYPE html>
<html>
<head>
	<script src="http://code.jquery.com/jquery-latest.js"></script>
	<script>
	$(function(){
		// Fonctionne : dans la fonction anonyme, $(this) est l'élément en cours
		$('#couleurs li').css('color', function(){
			return $(this).attr('class');
		});
		// Ne fonctionne pas : dans le contexte des paramètres, $(this) est l'objet global
		$('#couleurs li').css('color', $(this).attr('class'));
	});
	</script>
</head>
<body>
	<ul id="couleurs">
		<li class="yellow">Item</li>
		<li class="blue">Item</li>
		<li class="navy">Item</li>
		<li class="green">Item</li>
		<li class="red">Item</li>
		<li class="aqua">Item</li>
		<li class="gray">Item</li>
	</ul>
</body>
</html>
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, 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
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 10h58   #13
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 040
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

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

Informations forums :
Inscription : mars 2002
Messages : 30 040
Points : 45 141
Points : 45 141
Code :
$('p').each(function(idx,obj){$(obj).fadeIn($(obj).attr('speed')*1)});
ou en jouant avec le class
http://jsfiddle.net/tP5pK/6/
__________________
Ma page 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


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 12h49   #14
Membre actif
 
Avatar de eckerdecker
 
Inscription : décembre 2009
Messages : 132
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : décembre 2009
Messages : 132
Points : 154
Points : 154
OK !

Merci à vous deux, c'est donc bien ce qu'il me semblait : $(this).qqchose() directement en paramètre d'une méthode ne se réfère pas au sélecteur sur lequel on applique ladite méthode, on est bel et bien forcé de rentrer dans une fonction anonyme (ou pas) - que ce soit un callback, un handler ou autre chose -, dans la mesure ou la signature de la méthode le permet, pour que $(this) soit contextualisé sur ce sélecteur.
eckerdecker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 13h50   #15
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 807
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : juin 2008
Messages : 13 807
Points : 35 789
Points : 35 789
Oui et c'est logique, quand tu passes this dans les paramètres d'une méthode, tu n'es pas encore dans le parcours de la collection en référence mais juste dans l'interprétation de la méthode qui sera appelée.
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, 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
Bovino 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 07h58.


 
 
 
 
Partenaires

Hébergement Web