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 :

Référence du mot clef "this"


Sujet :

JavaScript

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2019
    Messages : 42
    Par défaut Référence du mot clef "this"
    Bonjour tout le monde, j'ai du mal à comprendre à quel objet fait référence le mot clef «this» à la ligne 24 du code suivant :

    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
    const compare = function(ids, asc){
    	return function(row1, row2){
    		const tdValue = function(row, ids){
    			return row.children[ids].textContent; 
    		}  
    		const tri = function(v1, v2){
    			if (v1 !== '' && v2 !== ''&& !isNaN(v1) && !isNaN(v2)){
    			return v1-v2;
    			}
    			else {
    			return v1.toString().localeCompare(v2);
    			}
    			return v1 !== '' && v2 !== '' && !isNaN(v1) && !isNaN(v2) ? v1 - v2 : v1.toString().localeCompare(v2); 
    		};
    		return tri(tdValue(asc ? row1 : row2, ids), tdValue(asc ? row2 : row1, ids));
    	}
    }
     
    const tbody = document.querySelector('tbody');
    const thx = document.querySelectorAll('th');
    const trxb = tbody.querySelectorAll('tr');
    thx.forEach(function(th){
    	th.addEventListener('click', function(){
    		let classe = Array.from(trxb).sort(compare(Array.from(thx).index0f(th), this.asc = !this.asc));
    		classe.forEach(function(tr){
    			tbody.appendChild(tr) 
    		}); 
    	}) 
    });
    Sur des exemples plus simples j'arrive à comprendre mais là j'ai du mal...

    Est-ce que c'est le <th> sur lequel on clique ?

    Merci pour votre aide.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,

    Oui.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2019
    Messages : 42
    Par défaut
    D'accord merci. Et est-ce que th.asc =!th.asc fonctionnerait aussi ?

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Tu veux dire d'un point de vu syntaxe ? Parce que avec ton code on ne sait pas ce que tu veux faire, on n'a pas toutes les infos...

  5. #5
    Membre extrêmement actif Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 532
    Par défaut
    Citation Envoyé par Sinouhé87 Voir le message
    D'accord merci. Et est-ce que th.asc =!th.asc fonctionnerait aussi ?
    non, pour ça faudrait que tu utilise une fonction fléchée

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2019
    Messages : 42
    Par défaut
    Ah bon pourquoi ?

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 205
    Par défaut
    Bonjour,
    Citation Envoyé par psychadelic
    non, pour ça faudrait que tu utilise une fonction fléchée
    ce n'est pas une question de type de fonction mais de scope et dans le cas présent l'utilisation de th fonctionnerait.
    Pour s'en convaincre il suffit de tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    thx.forEach(function (th) {
      th.addEventListener('click', function () {
        console.log("th :", th, this, this === th);
      })
    });
    avec une « arrow function » on pourrait passer par le event.target mais th serait tout aussi valable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    thx.forEach(function (th) {
      th.addEventListener('click', (e) => {
        const o = e.target;
        console.log("th :", th, this, o === th);
      })
    });

  8. #8
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Perso je n'ai toujours pas compris la question, je parle de la deuxième (la réponse à la première étant oui)...

  9. #9
    Membre extrêmement actif Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 532
    Par défaut
    Citation Envoyé par Beginner. Voir le message
    Perso je n'ai toujours pas compris la question, je parle de la deuxième (la réponse à la première étant oui)...
    tu fais référence à
    th.asc =!th.asc
    j'imagine ?

    ce genre de code sert à inverser une valeur booléenne
    Code JAVASCRIPT : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    let unTest = true;
    testVal  = !testVal;  //  équivalent à  testVal <= not testVal

    mais ce qui doit te déranger c'est qu'il à du au préalable écrire quelque chose du genre
    Code JAVASCRIPT : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    const thx = document.querySelectorAll('#maTable th')
    thx.forEach(th=>th.asc = true)
    pour assigner une nouvelle propriété booléenne (asc) sur chaque élément th qui visiblement lui permet d'indiquer si l'ordre de la colonne est ascendant ou non (hypothèse basée sur le nom de cette variable)


    Citation Envoyé par NoSmoking Voir le message
    Pour s'en convaincre il suffit de tester
    ah oui,.. puisqu'il s'agit d'une fonction anonyme...

    En fait ce qui m'étonne, c'est qu'il n'a pas testé par lui-même ce truc qui ne demande pas grand chose pour se forger une idée.

  10. #10
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Citation Envoyé par psychadelic Voir le message
    ce genre de code sert à inverser une valeur booléenne
    Oui effectivement ça j'avais compris...

    Citation Envoyé par psychadelic Voir le message
    mais ce qui doit te déranger c'est qu'il à du au préalable écrire quelque chose du genre
    Code JAVASCRIPT : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    const thx = document.querySelectorAll('#maTable th')
    thx.forEach(th=>th.asc = true)
    pour assigner une nouvelle propriété booléenne (asc) sur chaque élément th qui visiblement lui permet d'indiquer si l'ordre de la colonne est ascendant ou non (hypothèse basée sur le nom de cette variable)
    Oui bien vu. Il n'a pas mis cela dans son code mais apparemment ça peut quand même marcher : au départ th.asc sera undefined (et l'inverse de undefined c'est true) ensuite l’assignation (th.asc = !undefined) "crée" la propriété asc et l'initialise à true.

    Je crois que ton hypothèse concernant le sens de asc est bonne, cela semble logique...

  11. #11
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2019
    Messages : 42
    Par défaut
    Bonjour, dsl je n'ai pas été clair je reformule ma question :

    Dans mon code initial, si je remplace « this.asc=!this.asc » par « th.asc =!th.asc », le nouveau code serait-il équivalent à l'ancien ?

    D'après vos réponses, c'est oui si j'ai bien compris.

  12. #12
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Ah ok j'ai compris cette fois... La réponse est oui effectivement...

    Par rapport à la remarque de psychadelic tu devrais vérifier si il n'y a pas de problème car c'est seulement au premier clique que la propriété asc est "créée" et elle est initialisée à true.

    Si donc au départ (avant le premier clique) elle est censée être à false alors tout va bien mais si au départ elle est censée être à true eh bien au premier clique au lieu de passer à false (comme tu l’espères après l’exécution de this.asc = !this.asc) eh bien elle sera initialisée à true (elle vaudra donc true alors qu'elle devrait valoir false).

  13. #13
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2019
    Messages : 42
    Par défaut
    Ok merci beaucoup !

  14. #14
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2019
    Messages : 42
    Par défaut
    Oh regardez ce qu'on m'a répondu ailleurs :

    « Bonjour non il ne fonctionnerait pas si tu remplaçais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    this.asc = !this.asc
    // par
    th.asc = !th.asc
    par ce que cette ligne et situé dans la fonction exécuté au click d'un th et qu'au moment de l'exécution de cette fonction tous les th on été parcourues et que la variable th fait référence au th actuel dans le parcours des th donc il serait toujours soit égal au derniers th et pas à celui qui et cliqué soit la donnée aurait été libéré et tu aurais un ReferenceError »

    Mais alors normalement le code aurait dû être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Array.from(thx).indexOf(this), this.asc = !this.asc
    et pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Array.from(thx).indexOf(th), this.asc = !this.asc
    car indexOf( ) permet normalement de récupérer l'indice de la colonne sur lequel se trouve le <th> cliqué et si j'ai bien compris, en mettant « indexOf(th) » on risquerait de récupérer l'indice de la dernière colonne du tableau...

  15. #15
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,

    Ben il suffirait de tester pour trancher la question... As-tu testé ?
    Perso j'ai fait une petit teste et cela confirme les réponses données...
    Il y a aussi les codes de NoSmoking qui te permettent de constater cela...

  16. #16
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2019
    Messages : 42
    Par défaut
    Oui pardon je viens de tester, c'est l'autre personne qui se trompe du coup dsl.

  17. #17
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Ton code fonctionne comme tu veux ?

    PS : Chez moi il y avait une erreur notamment car tu as écrit index0f au lieu de indexOf...

  18. #18
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 205
    Par défaut
    Ce qui important dans le code que tu écris est la cohérence du code, ou tu utilises th ou tu utilises this mais pas un mixe des deux.

    Le deuxième point à souligné et que ta variable est dans un scope bien défini donc ce que l'on t'as expliqué est inexacte, chaque th ayant son gestionnaire d'événement click attaché il n'y aura pas de soucis.

  19. #19
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2019
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2019
    Messages : 42
    Par défaut
    Ok merci pour vos réponses !

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 20/08/2014, 16h09
  2. portée du mot clef this
    Par Torx26 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/04/2012, 21h15
  3. Réponses: 7
    Dernier message: 08/01/2006, 21h07
  4. mot clef sql pour nom de champ
    Par bobinou007 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/10/2004, 13h21

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