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 :

Fonction fonctionne malgré un message d'erreur


Sujet :

JavaScript

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2024
    Messages : 10
    Par défaut Fonction fonctionne malgré un message d'erreur
    Re bonjour,

    Je viens de découvrir quelque chose, ma fonction cacher/afficher texte comporte l'erreur suivante :
    script.js:3 Uncaught TypeError: Cannot read properties of undefined (reading 'innerHTML')
    at toggle_div
    Mais ma fonction de cacher ou afficher du texte fonctionne bien par contre sa ne lance pas ma seconde fonction qui consiste simplement en une boucle pour une écoute d'évènement

    La fonction cacher/afficher texte ne comportait pas ce message d'erreur avant que je créer ma deuxième fonction.

    En fait pour être plus clair, je tape un bloc de code, il fonctionne, j'en tape un deuxième et la le premier ne fonctionne plus ou m'affiche un message d'erreur?

    Ca doit être courant ce genre d'erreur mais ce que je cherche a comprendre c'est la méthodologie de réflexion de la machine qui lis mon code.


    Je vous mes le code complet js :

    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
    function toggle_div( btn, id_div )
    {
        btn.innerHTML = (btn.innerHTML == '+')? '-' : '+';
        btn.title = (btn.title == 'Afficher la suite')? 'Masquer la suite' : 'Afficher la suite';
        document.getElementById( id_div ).style.display = (document.getElementById( id_div ).style.display == 'none')? 'block' : 'none';
    }
     
     
     
    function ecoute()
    {
     
        let bouton = document.getElementsByClassName('.monBouton');
        for (let i in bouton){
            bouton.addEventListener("click", ()=>{
            console.log("btncliqué"+bouton[i]);
        });    
        }
    }
     
    toggle_div()
    ecoute()

  2. #2
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 496
    Par défaut
    Bonjour,

    La fonction function toggle_div( btn, id_div ) accepte deux paramètres, alors que vous l'avez utilisé (ligne 21) sans aucun paramètre, et donc JS se plante lorsqu'il arrive à la ligne btn.innerHTML ="......", car le paramètre btn est indéfini, la même chose pour le paramètre id_div.

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2024
    Messages : 10
    Par défaut
    Effectivement je n'y avait pas penser. Maintenant j'ai cette erreur:

    Uncaught ReferenceError: btn is not defined

    Pourtant je définit bien btn avec btn.innerHTML.

    Ma première fonction fonctionne toujours cela dit mais pas la deuxième

  4. #4
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 496
    Par défaut
    Montrez le nouveau code que vous utilisez pour voir ce qui se passe....

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 198
    Par défaut
    Bonjour,
    let bouton = document.getElementsByClassName('.monBouton');
    Attention :
    si on utilise querySelectorAll(), alors il faut mettre un point devant la classe ce qui représente le sélecteur CSS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const allBtns = document.querySelectorAll(".monBouton");        // il y a un point
    si on utile getElementsByClassName(), alors il faut mettre simplement le nom de la classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const allBtns = document.getElementsByClassName("monBouton");   // il n'y a pas de point
    Ressources :

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2024
    Messages : 10
    Par défaut
    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
    function toggle_div( btn, id_div )
    {
        btn.innerHTML = (btn.innerHTML == '+')? '-' : '+';
        btn.title = (btn.title == 'Afficher la suite')? 'Masquer la suite' : 'Afficher la suite';
        document.getElementById( id_div ).style.display = (document.getElementById( id_div ).style.display == 'none')? 'block' : 'none';
    }
     
     
     
    function ecoute()
    {
     
        let bouton = document.getElementsByClassName('.monBouton');
        for (let i in bouton){
            bouton.addEventListener("click", ()=>{
            console.log("btncliqué"+bouton[i]);
        });    
        }
    }
     
    toggle_div(btn, id_div )
    ecoute()

  7. #7
    Membre chevronné Avatar de ASCIIDEFOND
    Homme Profil pro
    Autodidacte
    Inscrit en
    Novembre 2002
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Autodidacte

    Informations forums :
    Inscription : Novembre 2002
    Messages : 235
    Par défaut
    let bouton = document.getElementsByClassName('.monBouton');
    Comme déjà souligné plus haut par NoSmoking,
    document.getElementsByClassName("monBouton"); // il n'y a pas de point
    Sinon une autre approche pour le même résultat et sans appel de fonction.

    Code html : 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
        <div id="container">
            <h2 class="sous-titre">What is Frontend Mentor, and how will it help me?</h2>
            <button type="button" title="Afficher la suite">+</button>
            <p class="text">
            <div style="display:none;">Ici le texte 1</div>
            </p>
     
            <h2 class="sous-titre">Is Frontend Mentor free ?</h2>
            <button type="button" title="Afficher la suite">+</button>
            <p class="text">
            <div style="display:none;">Ici le texte 2</div>
            </p>
     
            <h2 class="sous-titre">Can I use Frontend Mentor projects in my portfolio?</h2>
            <button type="button" title="Afficher la suite">+</button>
            <p class="text">
            <div style="display:none;">Ici le texte 3</div>
            </p>
        </div>

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            let mesDivs = document.querySelectorAll('#container > div'), // Tableau des divs présentes dans la div ID ="container"
            mesBoutons = document.querySelectorAll('#container > button') // idem pour les boutons présents dans la div ID ="container"
     
            mesBoutons.forEach((boutonSelect, index) => { // On énumère les éléments présents dans le tableau mesBoutons. Et index renverra l'index du bouton sélectionné (ex. 0,1 ou 2)
                boutonSelect.addEventListener('click', () => {
                    boutonSelect.innerText == '+' ? // Si c'est un + qui est affiché sur le bouton sélectionné
                    //Alors le text du bouton sera un -, son attribut title changera ainsi que le style.display de la div suivante du bouton
                     [boutonSelect.innerText = '-', boutonSelect.title = 'Masquer la suite', mesDivs[index].style.display = 'block'] :
                     //Sinon
                     [boutonSelect.innerText = '+', boutonSelect.title = 'Afficher la suite', mesDivs[index].style.display = 'none']
                })
            })

  8. #8
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 496
    Par défaut
    Citation Envoyé par CharlieVan Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    toggle_div(btn, id_div )
    ecoute()
    Citation Envoyé par CharlieVan Voir le message
    Pourtant je définit bien btn avec btn.innerHTML.
    Avant de passer aux fonctions, apprenez d'abord les bases de JS...

  9. #9
    Membre chevronné
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 387
    Par défaut
    Bonjour,

    Rappel, un élément P ne peut pas contenir un élément DIV.

    Quand on tente de valider
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <!DOCTYPE html><html lang=fr><head><title>no</title></head><body>
     
    <p><div>aa</div></p>
     
    </body></html>

    On obtient une erreur du genre
    Error: No p element in scope but a p end tag seen.
    Car les les éléments de type "en-ligne" ne peuvent pas accepter d'éléments de "bloque", sur firefox l'arbre est rendu tel que

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <p></p><div>aa</div><p></p>

    Les imbrications invalide sont préventivement fermées de manière standard
    afin d'homogénéiser l'affichage sur tous les navigateurs des syntaxes invalide.

    Bref, c'était pour l’anecdote.

    Je voulais surtout réagir dans la même démarche qu'ASCIDEFOND avec une version css.

    Code html : 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
    <div id="container">
    	<div id="section1">
    		<h2 class="sous-titre">What is Frontend Mentor, and how will it help me?</h2>
    		<a href="#section1" title="Afficher la suite" class="plus">+</a>
    		<a href="#" title="Afficher la suite" class="minus">-</a>
    		<div class="text">
    			<div>Ici le texte 1</div>
    		</div>
    	</div>
     
    	<div id="section2">
    		<h2 class="sous-titre">Is Frontend Mentor free ?</h2>
    		<a href="#section2" title="Afficher la suite" class="plus">+</a>
    		<a href="#" title="Afficher la suite" class="minus">-</a>
    		<div class="text">
    			<div>Ici le texte 2</div>
    		</div>
    	</div>
     
    	<div id="section3">
    		<h2 class="sous-titre">Can I use Frontend Mentor projects in my portfolio?</h2>
    		<a href="#section3" title="Afficher la suite" class="plus">+</a>
    		<a href="#" title="Afficher la suite" class="minus">-</a>
    		<div class="text">
    			<div>Ici le texte 3</div>
    		</div>
    	</div>
    </div>
     
    <style typ="text/css">
    	div .text div {
    		display: none;
    	}
    	div:target .text div {
    		display: block;
    	}
    	div:target .plus {
    		display: none;
    	}
    	div:target .minus {
    		display: block;
    	}
    	.minus {
    		display: none;
    	}
    </style>

    Pour être tout à fait sincère, cette dernière ne permet pas d'afficher un élément par défaut au chargement de la page,
    c'est donc d'un intérêt limité.

    Mais bon, on a déjà vu les progrès (phénoménal) de cette techno, on est pas à l'abri d'un correctif,
    un jour, peut être.

    Bonne journée.

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

Discussions similaires

  1. [MySQL] requete qui ne fonctionne pas,sans message d'erreur
    Par choupinou22 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 30/06/2015, 18h22
  2. Réponses: 2
    Dernier message: 13/08/2014, 08h14
  3. UPDATE avec jointure ne fonctionne pas sans message d'erreur
    Par EnRadeSurEclipse dans le forum Requêtes
    Réponses: 4
    Dernier message: 25/01/2010, 22h22
  4. Réponses: 2
    Dernier message: 10/01/2007, 23h28
  5. méssage d'erreur fonction d'agrégat
    Par developpeur_mehdi dans le forum Langage SQL
    Réponses: 4
    Dernier message: 10/03/2004, 12h42

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