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 :

système de notation étoiles : évènement sur previousElementSibling


Sujet :

JavaScript

  1. #1
    Membre confirmé
    Homme Profil pro
    Autre
    Inscrit en
    Mars 2021
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Mars 2021
    Messages : 206
    Par défaut système de notation étoiles : évènement sur previousElementSibling
    Bonjour,
    je fais encore appel à vos compétences, j'ai un système de notation avec des étoiles et une requête préparée qui fonctionne, j'ai du mal à construire la partie js et CSS et j'en suis au début. Je voudrais que quand on fait un mouseover sur une étoile les précédentes étoiles doivent aussi avoir la classe(ex. mousover sur la troisième étoile, la première deuxième et troisième deviennent rouges.
    Mon code marche juste sur l'étoile que je pointe, pourtant j'ai essayé dans la console de remonter a l'élément parent de mon étoile puis aux enfants des éléments précédents du même niveau et il sélectionne bien le i précédent (le test je l'ai fais sans boucle avec star[3]...:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let previousStars = star.parentNode.previousElementSibling.childNodes;
    Je pense que mon problème vient de la boucle while mais je trouve pas la solution :
    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
    window.onload = () => {
     
        //selectionner les etoiles
        const stars = document.querySelectorAll(".stars button i");
     
     
       //on boucle sur les etoiles pour ajouter un ecouteur d'evenement
            for(let star of stars) {
                star.addEventListener('mouseover', function() {
                star.classList.add('hover');
        //etoiles precedentes
                let previousStars = star.parentNode.previousElementSibling.childNodes;         
                    while(previousStars) {
                    previousStars.classList.add('hover');
                    previousStars = previousStars.parentNode.previousElementSibling.childNodes
                }
                });
            }
    }
    mon formulaire :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <div class="stars">
                    <form action="" method="post">
                    <button name="btnValueNote" class="disabled" type="submit" value="1"><i class="bi bi-star"></i></button>
                    <button name="btnValueNote" class="disabled" type="submit" value="2"><i class="bi bi-star"></i></button>
                    <button name="btnValueNote" class="disabled" type="submit" value="3"><i class="bi bi-star"></i></button>
                    <button name="btnValueNote" class="disabled" type="submit" value="4"><i class="bi bi-star"></i></button>
                    <button name="btnValueNote" class="disabled" type="submit" value="5"><i class="bi bi-star"></i></button>
                    </form>
            </div>
    merci pour votre aide.

  2. #2
    Membre Expert
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 489
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 489
    Par défaut
    Code javascript : 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
    const stars = document.querySelectorAll(".stars button i");
    stars.forEach(star => {
    star.addEventListener('mouseover', hoverStar);
    star.addEventListener('mouseout', reset);
    });
     
    function hoverStar() {
    	for(let i=0; i< stars.length; ++i) {
      	stars[i].classList.add('active');
        if(stars[i]===this) {
          return;
        }
    	}
    }
    function reset() {
      stars.forEach(star => {
      	star.classList.remove('active');
      });
    }
    je me demande s'il n'existe pas une solution plus elegante en css pur (avec :has() et le voisin direct par exemple)
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  3. #3
    Membre confirmé
    Homme Profil pro
    Autre
    Inscrit en
    Mars 2021
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Mars 2021
    Messages : 206
    Par défaut
    Bonjour,
    je vous remercie pour votre aide j'ai testé votre script il y a juste un petit souci que j'avais rencontré hier : dans la boucle for le classList.add ne fonctionne pas par contre si je fais un
    style.color="red" tout marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function hoverStar() {
    	for(let i=0; i< stars.length; ++i) {
      	stars[i].style.color="red";
        if(stars[i]===this) {
          return;
        }
    	}
    }
    function reset() {
      stars.forEach(star => {
      	star.style.color="white";
      });
    }
    Au lieu d'utiliser une classe celle ci peut être aussi la solution
    Pour bien comprendre ce code, pourriez vous m'expliquer cette condition (hier j'avais essayé la boucle for mais sans condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(stars[i]===this) {
          return;
        }
    merci beaucoup pour votre aide

  4. #4
    Membre Expert
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 489
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 489
    Par défaut
    stars[i].classList.add('active'); j'ai oublie de precise que j'avais utilise un autre nom de class
    => tu as utilise un classe "hover", alors que moi, je l'ai apelle "active" (pour eviter la confusion dans le css entre .hover & :hover)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(stars[i]===this) {
          return;
        }
    => je boucle sur toutes les etoiles, mais on ne veux pas activer les etoiles "apres" celle qu'on survol... si on survol 3, on ne veut pas activer 4 ni 5 donc une fois qu'on arrive a l'etoile qu'on survol, j'arrete de boucler
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  5. #5
    Membre confirmé
    Homme Profil pro
    Autre
    Inscrit en
    Mars 2021
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Mars 2021
    Messages : 206
    Par défaut
    Bonjour,
    merci pour vos explications très claires, j'aurais du m'en apercevoir pour la class mais j'ai fais un copier coller du code.
    je vous souhaite une bonne journée et encore merci

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

Discussions similaires

  1. système de notation par étoiles
    Par KREEN1978 dans le forum Langage
    Réponses: 6
    Dernier message: 24/01/2015, 04h58
  2. [2.x] Système de notation "étoile"
    Par caema dans le forum Symfony
    Réponses: 0
    Dernier message: 03/05/2014, 18h26
  3. Notation à étoiles - clignotement sur IE au survol
    Par -Eva- dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/08/2008, 22h33
  4. Créer un système de notation avec des étoiles
    Par babafredo dans le forum ASP
    Réponses: 2
    Dernier message: 02/04/2008, 15h06

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