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 :

Allumer les têtes de ligne/colonne d'un tableau matrice.


Sujet :

JavaScript

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 685
    Points : 132
    Points
    132
    Par défaut Allumer les têtes de ligne/colonne d'un tableau matrice.
    Bonjour,

    Voir ce codepen.

    Le code JS allume la tête de ligne et la tête de colonne au survol d'une cellule non vide.

    Cela marche bien mais cela a été fait il y a plus de 10 ans et cela peut être simplifié aujourd'hui.

    Mon niveau en javascript réclame un peu d'assistance.

    1) Sélectionner les cellules non vides hors têtes de lignes et têtes de colonnes.

    2) Au survol d'une cellule, trouver tête de ligne et tête de colonne correspondantes.

    3) Les allumer.

    4) Éteindre quand le pointeur quitte la cellule.

    Pouvez-vous me guider un peu ?

    Merci d'avance.

  2. #2
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 835
    Points
    2 835
    Par défaut
    Hello,

    Je ne suis pas très doué en JS natif donc je vais donner une réponse en jQuery en espérant que ça aide

    Mais
    1] sélectionner les cellules non vides; c'est forcément le cas.
    Si on reprend le Codepen d'exemple, l'événement est sur le survol de la balise a et donc elle n'existe que si une valeur existe (travail prémaché)
    2] Ensuite pour connaitre le titre de la ligne, il suffit de prendre le premier enfant du parent (.parent().first() ou sélectionner le premier th : .parent().find('th:first-child'))
    3] Pour trouver le titre de la colonne, il suffit de récupérer l'index du parent de l'élément en cours ($(this).parent().index()) et d'utiliser cet index sur la première ligne du tableau

    J'ai refait un Codepen qui suit ces explications (avec jQuery donc) : https://codepen.io/DarkStar123456/pen/XWRwWbO

    J'ai repris le tableau d'origine, à l'exception des thead td que j'ai changé en thead th parce que c'est beaucoup plus logique d'une part, et que ça empêchait de pouvoir sélectionner correctement les nth-child() d'autre part

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 685
    Points : 132
    Points
    132
    Par défaut
    Bonjour,

    Merci de ta réponse, c'est très intéressant.

    Je vais essayer de traduire cela en JS natif car je n'emploie pas jQuery.

    Je m'y mets dès que j'ai le temps.

    Je te tiens informé.

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

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 458
    Points : 4 617
    Points
    4 617
    Par défaut
    salut,
    en gardant ta structure actuelle & en JS natif :

    il faut juste ajouter une class CSS pour le hightLight
    Code css : Sélectionner tout - Visualiser dans une fenêtre à part
    .hightLight { color: red; }
    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
    document.querySelectorAll('tbody td:not(:first-of-type) a').forEach(cell => {
    	cell.addEventListener('mouseover', () => {
      	hoverCell(cell.parentNode);
      });
    });
    function clearHighLight() {
    	document.querySelectorAll('td a').forEach(a => {
      	a.classList.remove('hightLight');
      });
    }
    function hoverCell(cell) {
    	clearHighLight();
    	cell.parentNode.getElementsByTagName('a')[0].classList.add('hightLight');
      document.querySelectorAll('thead a')[cell.cellIndex-1].classList.add('hightLight');
    }
    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 habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 685
    Points : 132
    Points
    132
    Par défaut
    Bonjour,

    Merci de ta réponse.

    Je teste ce soir.

    Je vous tiens informés.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 685
    Points : 132
    Points
    132
    Par défaut
    Bonjour Doksuri,

    J'ai chargé ton code sur le codepen et cela fonctionne très bien à un détail près.

    Il faut que les têtes s'éteignent quand tu sors de hover (mouseout ?).

    J'avoue que je n'ai même pas eu le temps d'analyser ton code.
    Je vais le faire.

    Je vous tiens informés.

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

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 458
    Points : 4 617
    Points
    4 617
    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
    document.querySelectorAll('tbody td:not(:first-of-type) a').forEach(cell => {
    	cell.addEventListener('mouseover', () => {
      	hoverCell(cell.parentNode);
      });
      cell.addEventListener('mouseout', clearHighLight);
    });
    function clearHighLight() {
    	document.querySelectorAll('td a').forEach(a => {
      	a.classList.remove('hightLight');
      });
    }
    function hoverCell(cell) {
    	cell.parentNode.getElementsByTagName('a')[0].classList.add('hightLight');
      document.querySelectorAll('thead a')[cell.cellIndex-1].classList.add('hightLight');
    }
    le seul "hic" c'est que t'auras un effet de clignottement quand tu survol les cellules (apres si c'est vraiment genant, on peu ajouter un timeout)
    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 !

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 685
    Points : 132
    Points
    132
    Par défaut
    Bonjour,

    Merci de ta réponse.

    Je fais le test ce soir.

    Je vous tiens informé.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 685
    Points : 132
    Points
    132
    Par défaut
    Bonjour,

    Voir le codepen, ton code fonctionne très bien.

    Aucun effet de clignotement, je ne vois pas pourquoi il y en aurait, que crains-tu ?

    Petit détail je pense que c'est plus sympa d'appliquer l'effet au survol de la cellule plutôt que du lien (discutable, je reconnais, pas sûr...).
    C'est d'ailleurs ce que faisait l'ancien code.

    D'où ce sélecteur :

    Code css : Sélectionner tout - Visualiser dans une fenêtre à part
    tbody td:nth-child(n+2):not(:empty)

    Qu'en penses-tu ?

    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    document.querySelectorAll('tbody td:nth-child(n+2):not(:empty)')

    Je n'ai pas essayé de changer ton code derrière mais je pense qu'il y aurait peu à faire, non ?

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 685
    Points : 132
    Points
    132
    Par défaut
    Bonjour,

    J'ai fait le truc à ma sauce de non-expert JS en reprenant les sélecteurs de Doksuri que je remercie encore.


    Code js : 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
    const val = aid.querySelectorAll ('tbody td:nth-child(n+2):not(:empty)');
     
     
    for (let i = 0; i < val.length; i++)
    {
    val[i].addEventListener ('mouseover', function ()
    {
    this.parentNode.getElementsByTagName('a')[0].classList.add('hightLight');
     
    document.querySelectorAll('thead a')[this.cellIndex-1].classList.add('hightLight');
     
    }
    );
     
    val[i].addEventListener ('mouseout', function ()
    {
    this.parentNode.getElementsByTagName('a')[0].classList.remove('hightLight');
     
    document.querySelectorAll('thead a')[this.cellIndex-1].classList.remove('hightLight');  
     
    }
    );
    }

    Cela marche comme voulu avec hover sur le td, voir le codepen.

    Je me demande s'il n'est pas possible d'avoir un sélecteur plus simple pour trouver la tête de colonne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    querySelector('thead th:nth-child('+ (this.cellIndex + 1) +') > a')
    En passant en th tous les td du thead comme demandé à juste titre par darkstar123456.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 685
    Points : 132
    Points
    132
    Par défaut
    Bonjour,

    J'en suis là sur le codepen.

    Sauf erreur cela ne fait appel qu'à un seul tableau.

    Si vous voyez comment optimiser merci d'avance.

    Code js : 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
    const val = aid.querySelectorAll ('tbody td:nth-child(n+2):not(:empty)');
     
    for (let i = 0; i < val.length; i++)
    {
    val[i].addEventListener ('mouseover', function ()
    {
    this.parentNode.querySelector('td:first-child > a').classList.add('hightLight');
     
    aid.querySelector('thead th:nth-child('+ (this.cellIndex + 1) +') > a').classList.add('hightLight');
     
    }
    );
     
    val[i].addEventListener ('mouseout', function ()
    {
    this.parentNode.querySelector('td:first-child > a').classList.remove('hightLight');
     
    aid.querySelector('thead th:nth-child('+ (this.cellIndex + 1) +') > a').classList.remove('hightLight');  
     
    }
    );
    }

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 685
    Points : 132
    Points
    132
    Par défaut
    Bonjour,

    Dernier petit changement j'affecte la classe non pas au lien mais à son td parent.

    Voir le codepen.

    J'attends quelques jours avant de cocher Résolu, au cas où quelqu'un propose des améliorations.

    Encore merci de votre aide.

    Code js : 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
    const val = aid.querySelectorAll ('tbody td:nth-child(n+2):not(:empty)');
     
    for (let i = 0; i < val.length; i++)
    {
    val[i].addEventListener ('mouseover', function ()
    {
    this.parentNode.querySelector('td:first-child').classList.add('hightLight');
     
    aid.querySelector('thead th:nth-child('+ (this.cellIndex + 1) +')').classList.add('hightLight');
     
    }
    );
     
    val[i].addEventListener ('mouseout', function ()
    {
    this.parentNode.querySelector('td:first-child').classList.remove('hightLight');
     
    aid.querySelector('thead th:nth-child('+ (this.cellIndex + 1) +')').classList.remove('hightLight');  
     
    }
    );
    }

    Code css : Sélectionner tout - Visualiser dans une fenêtre à part
    .hightLight a {color: red}

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/10/2013, 13h56
  2. Comment récupérer les numéros de ligne/colonne d'une plage
    Par Val2000 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 18/07/2013, 16h56
  3. Filtre et tri sur l'en-tête d'une colonne d'un tableau
    Par davidtse dans le forum GWT et Vaadin
    Réponses: 6
    Dernier message: 25/11/2010, 10h20
  4. supprimer l'espace entre les cellules d'une colonne d'un tableau
    Par 123quatre dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 06/09/2007, 10h52
  5. [VBA] Masquer les sélecteurs de ligne/colonnes (1,2..,A,B,C)
    Par skual dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 02/03/2006, 08h52

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