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 :

Alterner une classe sur onclick


Sujet :

jQuery

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Février 2009
    Messages
    635
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 635
    Par défaut Alterner une classe sur onclick
    Bonjour,

    Je cherche à alterner une class CSS à chaque clique sur un bouton via onclick,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function alterneClass(id, class_default, class_change) 
    {  
    	if ($('#'+id).attr('class'))==class_default) {
    	  $('#'+id).removeClass(class_change).addClass(class_change);
    	}
            else if ($('#'+id).attr('class'))==class_change) {
    		$('#'+id).removeClass(class_default).addClass(class_change);
    	}
    }
    pas très sûr de m'y prendre de la bonne façon...

    merci d'avance pour vos conseils,

  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 : 75
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  3. #3
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 212
    Par défaut
    Bonjour,
    d'une manière générale, il serait temps que dominos prenne le soin de lire attentivement la documentation jQuery riche en méthodes et exemples

  4. #4
    Membre éclairé
    Inscrit en
    Février 2009
    Messages
    635
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 635
    Par défaut
    Finalement j'ai adapté la syntaxe de la manière suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function changeCSS(id, id_click, class_default, class_change) 
    { 
    	collection = document.querySelectorAll("[id^='"+id+"']");
    	co = collection.length;
    	for (i = 0; i < co; i++) {
    		$(collection[i]).removeClass(class_change).addClass(class_default);		
    	}
    		$('#'+id_click).click(function(){
    			$('#'+id_click).removeClass(class_default).addClass(class_change);
    	    });
    }
    toggleClass() ne correspond pas dans le cas présent car je souhaite qu'une fois cliqué se soit les autres div qui retournent à la classe par défaut. j'ai fini par comprendre mon erreur tout seul.

    Citation Envoyé par NoSmoking Voir le message
    Bonjour,
    d'une manière générale, il serait temps que dominos prenne le soin de lire attentivement la documentation jQuery riche en méthodes et exemples
    Merci pour le conseil.

  5. #5
    Membre éclairé
    Inscrit en
    Février 2009
    Messages
    635
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 635
    Par défaut
    Dans une div conteneur se trouve d'autres div, dans la fonction précédente j'alterne une classe à chaque clique sur l'une d'elle.
    mais un clic effectué hors des ces div, c'est à dire dans la div du conteneur ou body ou html...
    toutes les 3 div de l'exemple ci-dessous devraient retourner à la classe par défaut...

    Le soucis est que lors du clique sur l'une de ces 3 div il semble se confondre avec la div conteneur du coup plus rien fonctionne.

    Petit exemple simplifié du problème...

    Code CSS : 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
    <style>
    .conteneur {
    border: 1px solid green; 
    width: 500px; 
    height: 500px;
    }
    .class-default {
    background: silver; 
    height: 100px;
    margin:5px;
    }
    .class-change {
    background: gray; 
    width: 400px; 
    height: 100px;
    margin:5px;
    }
    </style>

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <div id="toto" class="conteneur" onclick="retourClassDefault('madiv', 'class-change','class-default');">
    <div id="madiv1" onclick="changeClass('madiv','madiv1', 'class-default','class-change');" class="class-default"></div>
    <div id="madiv2" onclick="changeClass('madiv','madiv2', 'class-default','class-change');" class="class-default">du texte</div>
    <div id="madiv3" onclick="changeClass('madiv','madiv3', 'class-default','class-change');" class="class-default">du texte</div>
    </div>

    Code JS+JQuery : 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
    <script>
    function changeClass(id, id_click, class_default, class_change) 
    { 
    	collection = document.querySelectorAll("[id^='"+id+"']");
    	co = collection.length;
    	for (i = 0; i < co; i++) {
    		$(collection[i]).removeClass(class_change).addClass(class_default);
    	}
    	$('#'+id_click).click(function(){
    		$('#'+id_click).removeClass(class_default).addClass(class_change);
    	});
    }
     
    function retourClassDefault(id, class_change, class_default) 
    { 
    	collection = document.querySelectorAll("[id^='"+id+"']");
    	co = collection.length;
    	for (i = 0; i < co; i++) {
    		//$('#conteneur').click(function(){
    			$(collection[i]).removeClass(class_change).addClass(class_default);
    		//});
    	}
    }
    </script>

    Désolé, je n'ai rien trouvé dans la doc

  6. #6
    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 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    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 659
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     document.querySelectorAll("[id^='"+id+"']");
    a quoi servent les sélecteurs jquery ?
    Ma page Developpez - Mon Blog 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

    Venez sur le Chat de Développez !

  7. #7
    Membre éclairé
    Inscrit en
    Février 2009
    Messages
    635
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 635
    Par défaut
    Dans ce mode fonctionnement, les div ont un id incrémenté, la collection permet de les identifier par leurs noms communs,
    exemple madiv1, madiv2, madiv3

    Pour appeler la fonction, l'incrémentation n'est plus nécessaire => changeCSS('madiv'...

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Quelle usine à gaz...

    En utilisant correctement jQuery, ça prend moins de 10 lignes... (... commentaires et indentation compris !)

    Je t'aide pour le HTML (qu'on pourrait encore simplifier, mais bon) :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <div class="conteneur">
      <div class="class-default">du texte 1</div>
      <div class="class-default">du texte 2</div>
      <div class="class-default">du texte 3</div>
    </div>

    Quant à ton problème essentiel, il se règle grâce à : event.stopPropagation()

    Description: Prevents the event from bubbling up the DOM tree, preventing any parent handlers from being notified of the event

    Description: Empêche l'événement de "buller" (= remonter) dans l'arborescence DOM, empêchant les gestionnaires parents d'être informés de l'événement
    Bon. Vu que j'ai écrit le code... :
    Code jQuery : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // si on clique dessus
    $('.conteneur > div').on('click', function(event){
      event.stopPropagation(); // empêche de remonter le DOM (le clic ne s'applique PAS au parent)
      $('.conteneur > div').not(this).toggleClass('class-change',false).toggleClass('class-default',true);
      $(this).toggleClass('class-change class-default');
    });
    // si on clique en dehors
    $(':not(.conteneur > div)').on('click', function(){
      $('.conteneur > div').toggleClass('class-change',false).toggleClass('class-default',true);
    });
    10 lignes.
    Dernière modification par Invité ; 12/12/2017 à 10h17.

  9. #9
    Membre éclairé
    Inscrit en
    Février 2009
    Messages
    635
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 635
    Par défaut
    Vous avez mangé du chien ce matin ? Quelle agressivité de bon matin !! Pour votre gouverne, je débute à peine avec ajax/jquery... Et votre code, il fonctionne pas !

    (1 ligne)


  10. #10
    Invité
    Invité(e)
    Par défaut
    Tant pis. (2 mots )

Discussions similaires

  1. Implémenter l'agrégation d'une classe sur elle-même
    Par elvex dans le forum Diagrammes de Classes
    Réponses: 2
    Dernier message: 11/04/2009, 22h28
  2. recuperer une class sur mon serveur
    Par hterrolle dans le forum Général Java
    Réponses: 6
    Dernier message: 05/12/2007, 22h14
  3. Mettre une class sur tous les input sauf les radio
    Par kevinf dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 22/10/2007, 20h26
  4. attacher une fonction sur onclick
    Par julien.63 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 05/10/2007, 20h00
  5. Afficher un bouton appartenant à une classe sur une form
    Par Julien_riquelme dans le forum Composants VCL
    Réponses: 2
    Dernier message: 05/09/2005, 13h10

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