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

JavaScript Discussion :

Mise à jour fonction JavaScript


Sujet :

JavaScript

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 4
    Par défaut Mise à jour fonction JavaScript
    Bonjour à tous, je n'arrive pas à résoudre un problème et je demande donc de l'aide de la part de communauté.

    Voici mon problème je cherche à cliquer sur des liens ayant comme id=".A-playlist-i" avec i variant de 1 à n qui m'affiche le contenu associé à cette playlist qui a pour id="S-section-i" (A car cela est contenu dans un aside et S car c'est contenu dans une section).

    Dans un premier temps j'ai donc créer une liste Li qui parcourt mon "aside" et ma "section" et qui me donne toutes les playlists existantes.

    Dans un second temps j'utilise l'évenement clique; quand je clique sur n'importe quelle playlist je veux qu'il affiche le contenu correspondant dans la section. Par exemple si je clique sur playlist 1 (id="A-section-2") il cache toutes les playlists "S-section-k" avec k=!i et m'affiche uniquement "S-section-2" (cad k==i).

    Cependant lorsque le programme s’exécute et que je clique sur un lien, il parcourt toute la boucle for (k variant de 1 à n) sans executer le script. du coup k=n+1 et le contenu de la section est logiquement inchangé.

    Comment puis je faire pour que la fonction s'éxécute dans la boucle?

    Merci infiniment de votre coopération!

    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
    43
    44
    45
    46
    47
    48
    49
     
    <script>
     
        var Li=function(){
            var size=document.querySelectorAll('aside .A-playlist').length;
     
     
            var L=new Array();
            var M=new Array();
            for (var i = 0; i < size; i++) {
                 var A_nom_playlist=document.querySelectorAll('aside .A-playlist')[i].id;
                 var S_nom_playlist=document.querySelectorAll('section .S-playlist')[i].id;
                 L=L.concat('#'+A_nom_playlist);
                 M=M.concat('#'+S_nom_playlist);
     
     
            };
            return([L,M]);
     
        };
     
     
        var L=Li()[0];
        var M=Li()[1];
     
            var taille=L.length;
        for(var j=0;j<taille;j++){
            $(L[j]).click(function(){
                for(var k=0;k<taille;k++){
                    if(k==j){
                        $(M[k]).show();
     
                    }
                    else{
                        $(M[k]).hide();
                    }
     
                }
     
     
     
            });
        }
     
     
     
     
     
    </script>

  2. #2
    Membre émérite
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 340
    Par défaut
    Bonjour,
    Par rapport à l'identifiant ".A-playlist-i", je pense qu'il faudrait échapper le point au niveau du "querySelectorAll" ou alors ne pas mettre de point.
    Peut-être un début de solution, si on laisse le point :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <aside>
    	<a id=".A-playlist-1"></a>
    	<a id=".A-playlist-2"></a>
    	<a id=".A-playlist-3"></a>
    </aside>
    <script>
    var size=document.querySelectorAll("aside [id^=\\.A-playlist]").length;
    </script>

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 4
    Par défaut
    bonjour Loralina,

    je ne comprends pas trop ce que tu cherches à me dire. J'ai oublié de préciser que toutes les playlist de l'aside (id=A-playlist-i) font partis du même classe (A-playlist) et il est en de même pour le contenu correspondant dans la section ( id=S-section-i appartenant tous à la classe S-playlist). Du coup je n'ai aucun problème dans ma 1ere boucle et j'obtiens bien L=['#S-playlist-1','#S-playlist-2','#S-playlist-3'] et M=['#A-playlist-1','#A-playlist-2','#A-playlist-3'].
    Mon problème réside dans la seconde boucle.
    Est ce plus clair pour vous?

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    <aside class="aside">
     
    			<!-- PLAYLIST -->
    			<div class='A-playlist' id='A-playlist-1'><a href="#">Playlist 1</a></div>
    			<div class='A-playlist' id='A-playlist-2'><a href="#">Playlist 2</a></div>
    			<div class='A-playlist' id='A-playlist-3'><a href="#">Playlist 3</a></div>
     
    		</aside>
     
    <section class="section">
     
    			<div class='S-playlist' id='S-playlist-1'>
    				<div class='col-12'><img src="images/computer-640.jpg" class="images"></div>
    			</div>
     
     
    			<div class='S-playlist' id='S-playlist-2'>
    				<div class='col-4'><img src="images/bokeh-640.jpg" class="images"></div>
    				<div class='col-4'><img src="images/berlin-640.jpg" class="images"></div>
    				<div class='col-4'><img src="images/blur-640.jpg" class="images"></div>
    				<div class='col-4'><img src="images/bokeh-640.jpg" class="images"></div>
    			</div>
     
    			<div class='S-playlist' id="S-playlist-3">
    				<div class='col-6'><img src="images/analytics-640.jpg" class="images"></div>
    				<div class='col-6'><img src="images/apple-640.jpg" class="images"></div>
    			</div>
     
    		</section>
     
     
    	</body>
     
    <script>
     
    	var Li=function(){
    		var size=document.querySelectorAll('aside .A-playlist').length;
     
    		var L=new Array();
    		var M=new Array();
    		for (var i = 0; i < size; i++) {
    			 var A_nom_playlist=document.querySelectorAll('aside .A-playlist')[i].id;
    			 var S_nom_playlist=document.querySelectorAll('section .S-playlist')[i].id;
    			 L=L.concat('#'+A_nom_playlist);
    			 M=M.concat('#'+S_nom_playlist);
     
     
    		};
    		return([L,M]);
     
     
    	};
     
    	var L=Li()[0];
    	var M=Li()[1];
     
    var taille=L.length;
    	for(var j=0;j<taille;j++){
    		$(L[j]).click(function(){
     
     
    			for(var k=0;k<taille;k++){
    				if(k==j-1){
    					$(M[k]).show();
     
    				}
    				else{
    					$(M[k]).hide();
    				}
     
    			}
     
     
     
    		});
    	}
    </script>

  4. #4
    Membre émérite
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 340
    Par défaut
    Merci pour ces précisions.

    En fait, vous aviez écrit :
    des liens ayant comme id=".A-playlist-i" avec i variant de 1 à n
    Je pensais que vous aviez des liens comme dans le code que je proposais et que vous utilisiez "querySelectorAll" sur les "id".

    Maintenant, je comprends mieux.

    Le problème ne serait-il pas ici dans la fonction de clic :
    La variable "j" est externe à la fonction.
    De ce fait, quel que soit l'objet cliqué, "j" aura la même valeur pour tous, c'est à dire celle de la variable "taille", qui est la valeur à la sortie de la boucle.
    C'est un problème très classique.
    Pour éviter cela, vous pourriez définir sur chaque objet une propriété "j" contenant la valeur de la variable "j" et utiliser "this.j" dans la fonction.

    Je n'utilise pas jquery, mais à première vue, cela donnerait quelque chose de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for(var j=0;j<taille;j++){
    	$(L[j])[0].j=j;
    	$(L[j]).click(function(){
    		for(var k=0;k<taille;k++){
    			if(k==this.j){
    				$(M[k]).show();
    			}
    			else{
    				$(M[k]).hide();
    			}
    		}
    	});
    Je n'ai pas remis le "-1" dans la comparaison ("k==this.j" et non "k==this.j-1"), à voir s'il est nécessaire.

    A noter que dans votre code, il y a de nombreuses choses à optimiser, par exemple en exécutant une seule fois la fonction "Li" comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var ar=Li();
    var L=ar[0];
    var M=ar[1];

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 4
    Par défaut
    Cela marche parfaitement, merci de votre contribution!
    Je pensais bien que la réponse était avec le this

    Cependant j'ai une petite question, j'ai du mal à comprendre la ligne de code suivante :
    Pouvez vous juste me détailler cette ligne?

  6. #6
    Membre émérite
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 340
    Par défaut
    Oui, mais n'utilisant pas jquery, ma réponse sera approximative :

    En faisant "$(L[j]).click(...)", jquery doit créer, sur un objet, une fonction du style "onclick", ou, plus probablement, associe une fonction à un événement de clic avec "addEventListener", ce qui revient presque au même.
    L'objet attaché à cet événement n'est pas directement "$(L[j])", mais "$(L[j])[0]" ("$(L[j])" étant comme un array).
    Le "this" se réfère à l'objet sur lequel est appelée la fonction de clic, ici un objet "div" sur lequel on a défini une propriété "j".

    On aurait aussi pu écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var objet=$(L[j])[0];
    objet.j=j;
    objet.onclick=function(){...};
    D'une manière générale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var objet={prop:123,test:function(){alert(this.prop);}};
    objet.test(); //affiche 123

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 4
    Par défaut
    Très bien, merci beaucoup!
    Bonne soirée

Discussions similaires

  1. [XL-2013] Mise à jour fonction personnalisée
    Par jcs75 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 06/12/2024, 17h08
  2. [XL-2010] Mise à jour Fonction personnalisée
    Par Ashireon dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/05/2013, 13h17
  3. [XL-2003] Mise à jour fonction
    Par bigboy dans le forum Excel
    Réponses: 5
    Dernier message: 03/10/2012, 20h36
  4. Gadget Vista/Seven : fonction de mise à jour en Javascript
    Par Anthony-28 dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 01/11/2009, 20h31
  5. [AJAX] mise à jour controle javascript/ajax
    Par roduce dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/06/2008, 13h02

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