Erreur requête JS

Fermé
Ipoote Messages postés 45 Date d'inscription dimanche 23 septembre 2018 Statut Membre Dernière intervention 21 mai 2023 - Modifié le 13 mai 2022 à 12:50
 DoctorHow - 13 mai 2022 à 20:49
Bonjour,

Je poste ce message car je sors d'un cours sur JS, et mon code me retourne des erreurs dont je ne comprends pas la raison.
Si quelqu'un a une solution ou une explication je suis preneur, car j'ai beau me creuser la tête sur le problème je ne trouve toujours pas la solution.
Je pense que le CSS n'est pas important sachant qu'il était uniquement stipulé de mettre la classe "invisible" dans la variable cardASupprimer, je le mets quand même dans le doute.

var croix = document.getElementsByClassName("pcard__suppression")
var cardASupprimer = document.getElementsByClassName("pcard")
var reapp = document.getElementsByClassName("regenerer bouton")

function cacher(){
    const evenement_suppression = new CustomEvent("suppression_pcard");
    cardASupprimer.dispatchEvent(evenement_suppression);
    cardASupprimer.classList.add("invisible")
}

for (var i = 0 ; i < croix.length; i++) {
    croix[i].addEventListener('click', cacher) ; 
}


function reapparaitre(){
    this.classList.remove("invisible")
    document.getElementsByClassName('feedback__suppression').innerHTML = '';
}

for (var i = 0 ; i < reapp.length; i++) {
    reapp[i].addEventListener('click', reapparaitre) ; 
}


<!DOCTYPE html>
<html>

<head>
    <title>Nom Prénom</title>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="assets/css/styles.css">
</head>

<body>
    <header>
        <hgroup>
            <h1>Bases du web</h1>
            <h2>Nom Prénom</h2>
        </hgroup>
        <nav id="menu_principal" class="">
            <ul>
                <li><a href="index.html" class="actif">Base</a></li>
                <li><a href="versionajax.html">Version Ajax</a></li>
            </ul>
        </nav>
    </header>
    <main>
        <h2>Notre personnel</h2>
        <section class="set-of-pcard">


            <article class="pcard pcard--reduit">
                <div class="pcard__suppression">x</div>
                <header class="pcard__header">
                    <div class="pcard__cadre-portrait">
                        <img class="pcard__portrait" src="assets/img/portrait6.JPG" alt="Maelle">
                    </div>

                    <h2 class="pcard__nom">Maëlle Paquereau</h2>
                    <h3 class="pcard__fonction">Médiatrice Scientifique</h3>
                </header>

                <section class="pcard__main">
                    <a href="#" class="pcard__more">Voir +</a>
                </section>

                <footer class="pcard__footer">
                    <div class="pcard__resultat">
                        <div class="pcard__score">78%</div>
                        <div class="pcard__item">Satisfaction</div>
                    </div>
                    <div class="pcard__resultat">
                        <div class="pcard__score">75%</div>
                        <div class="pcard__item">Occupation</div>
                    </div>
                </footer>

            </article>

            <article class="pcard pcard--reduit">
                <div class="pcard__suppression">x</div>
                <header class="pcard__header">
                    <div class="pcard__cadre-portrait">
                        <img class="pcard__portrait" src="assets/img/portrait3.JPG">
                    </div>

                    <h2 class="pcard__nom">Johnatan Trust</h2>
                    <h3 class="pcard__fonction">Web Designer</h3>
                </header>

                <section class="pcard__main">
                    <a href="#" class="pcard__more">Voir +</a>
                </section>

                <footer class="pcard__footer">
                    <div class="pcard__resultat">
                        <div class="pcard__score">87%</div>
                        <div class="pcard__item">Satisfaction</div>
                    </div>
                    <div class="pcard__resultat">
                        <div class="pcard__score">89%</div>
                        <div class="pcard__item">Occupation</div>
                    </div>
                </footer>

            </article>
            <article class="pcard pcard--reduit">
                <div class="pcard__suppression">x</div>
                <header class="pcard__header">
                    <div class="pcard__cadre-portrait">
                        <img class="pcard__portrait" src="assets/img/portrait5.JPG">
                    </div>

                    <h2 class="pcard__nom">Hérald Norton</h2>
                    <h3 class="pcard__fonction">Coach Sportif</h3>
                </header>

                <section class="pcard__main">
                    <a href="#" class="pcard__more">Voir +</a>
                </section>

                <footer class="pcard__footer">
                    <div class="pcard__resultat">
                        <div class="pcard__score">82%</div>
                        <div class="pcard__item">Satisfaction</div>
                    </div>
                    <div class="pcard__resultat">
                        <div class="pcard__score">95%</div>
                        <div class="pcard__item">Occupation</div>
                    </div>
                </footer>

            </article>

        </section>
    </main>
    <aside>
        <section>
            <p class="regenerer bouton">Faire réapparaitre</p>
        </section>
        <section>
            <h2>Messages</h2>
            <article id="feedback">
                <div class="feedback__message feedback__chargement">Les personnes ont été chargées depuis la base de données</div>
                <div class="feedback__message feedback__suppression">Vous venez de supprimer une personne</div>
                <div class="feedback__message feedback__suppression">Vous venez de supprimer une personne</div>
            </article>


        </section>
    </aside>

    </main>

    <footer>
        <p id="texte-footer">Mineure Informatique</p>
    </footer>

    <script type="text/javascript" src="js/pcard.js"></script>
    <script type="text/javascript" src="js/base.js"></script>
    <script type="text/javascript" src="js/chargementAjax.js"></script>

</body>

</html>


@charset "UTF-8";

/* [https://meyerweb.com/eric/tools/css/reset/]
   v2.0 | 20110126
   License: none (public domain)


*/html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video {    margin: 0;    padding: 0;    border: 0;    font-size: 100%;    font: inherit;    vertical-align: baseline;}/* HTML5 display-role reset for older browsers */article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section {    display: block;}body {    line-height: 1;}ol,ul {    list-style: none;}blockquote,q {    quotes: none;}blockquote:before,blockquote:after,q:before,q:after {    content: "";    content: none;}table {    border-collapse: collapse;    border-spacing: 0;}/******** Mon reset **********/* {    box-sizing: border-box;}html {    font-size: 14px;}em {    font-style: italic;}strong {    font-weight: bold;}/**** Général *********************/body {    font-family: "Open Sans", sans-serif;    color: #666;    padding: 0 0rem;    background-color: #111;}/******** HEADER ****************/body>header {    position: fixed;    top: 0;    left: 0;    width: 100%;    background-color: rgba(255, 255, 255, 0.98);    /*  box-shadow: 0 -3px 20px rgba(255, 255, 255, 0.55);  */    z-index: 10;}body>header hgroup {    padding: 1.5rem 1.5rem 0 1.5rem;}body>header h1 {    font-size: 1.7rem;    font-weight: bold;    margin-bottom: 0.5rem;}body>header h2 {    font-size: 1.3rem;    margin-bottom: 1rem;}/**** MENU **************************************/#menu_principal {    padding-left: 1rem;}#menu_principal ul {    display: flex;    flex-direction: row;}#menu_principal li {    margin-right: 0.5rem;}#menu_principal a.actif {    background-color: #444;    color: #DDD;}#menu_principal a {    text-decoration: none;    color: inherit;    display: block;    padding: 10px;    -webkit-transition: 0.5s ease background;    transition: 0.5s ease background;    border-radius: 3px 3px 0 0;}#menu_principal a:hover {    background-color: #111;    color: #DDD;}#menu_principal.sombre {    color: #DDD;    background-color: #111;}#menu_principal.sombre a.actif {    background-color: #DDD;    color: #444;}#menu_principal.sombre a:hover {    background-color: #DDD;    color: #111;}/********* Contenu principal ***/main {    padding: 10rem 2rem 3rem 2rem;    background-color: #111;    color: #FFF;    background-image: url("../img/bg.svg");    background-position: center;    background-size: cover;}main h2,aside h2 {    font-weight: bold;    font-size: 1.5rem;    margin-bottom: 2rem;}main a,aside a {    color: #FFF;}.bouton {    display: inline-block;    color: #AAA;    margin: 0.5rem;    padding: 0.5rem 1rem;    border: solid #aaa 1px;    border-radius: 1rem;    cursor: pointer;    user-select: none;    transition: all 0.3s ease;    backface-visibility: hidden;    -webkit-font-smoothing: subpixel-antialiased;}.bouton:hover {    color: #fff;    border-color: #fff;    /*transform: scaleX(1.05) scaleY(1.05);*/}/*********** Sections et Articles **************************************************/aside {    background-color: #111;    color: #FFF;    padding: 3rem;}aside section {    margin-bottom: 2rem;}aside article {    padding: 0;    text-align: justify;    line-height: 1.5rem;}aside article h3 {    font-weight: bold;    font-size: 1.2rem;    margin-bottom: 0.5rem;}aside article ul,aside article ol {    margin-left: 2rem;    margin-bottom: 1rem;}aside article ul {    list-style-type: circle;}aside article ol {    list-style-type: decimal;}aside article li {    padding-bottom: 2px;}aside p {    margin-bottom: 1rem;}/**************** Footer ************************************/body>footer {    position: fixed;    bottom: 0;    left: 0;    padding: 1rem 2rem;    width: 100%;    background-color: rgba(255, 255, 255, 0.9);    box-shadow: 0 3px 20px rgba(0, 0, 0, 0.25);    z-index: 10;}body>footer p {    padding: 0 0 0 0;}.set-of-pcard {    display: flex;    flex-wrap: wrap;    justify-content: space-between;    gap: 1rem;}.pcard {    border-radius: 8px;    box-shadow: 20px 20px 22px rgba(0, 0, 0, 0.2);    font-family: "Poppins", sans-serif;    max-width: 20rem;    min-width: 15rem;    position: relative;    display: flex;    flex-direction: column;    align-items: center;    text-align: center;    padding: 0;    line-height: 1;    color: #FFF;    background-color: rgba(255, 255, 255, 0.1);    backdrop-filter: blur(20px);    margin-bottom: 2rem;    flex: 1 1 20rem;    overflow: hidden;    transition: all ease-in 0.5s;    /*, height ease-in 0.5s, width ease-in 0.5s;*/}.pcard.invisible {    opacity: 0;}.pcard__suppression {    width: 2rem;    height: 2rem;    position: absolute;    top: 0.5rem;    right: 0.5rem;    padding: 0.5rem;    color: rgb(207, 206, 206);    cursor: pointer;    border-radius: 50%;    transition: background-color ease-in 0.2s, color ease-in 0.2s;    font-family: monospace;}.pcard__suppression:hover {    background-color: rgba(255, 255, 255, 0.1);    color: #fff;}.pcard__header {    margin-bottom: 1rem;    transform: scale(0.8);}.pcard__main {    margin-bottom: 3rem;}.pcard__cadre-portrait {    height: 8rem;    width: 8rem;    background-color: rgba(255, 255, 255, 0.06);    backdrop-filter: blur(20px);    border-radius: 50%;    margin: 30px auto 20px auto;}.pcard__portrait {    height: 86%;    border-radius: 50%;    margin-top: 7%;}.pcard__nom {    margin-bottom: 0.6rem;    letter-spacing: 0.7px;    font-weight: bold;}.pcard__fonction {    margin-bottom: 1rem;    letter-spacing: 1.5px;    color: rgb(230, 230, 230);    font-weight: normal;}.pcard__main {    width: 100%;}.pcard__more {    width: 80%;    margin: auto;    font-size: 1.2rem;    font-weight: normal;    letter-spacing: 1.5px;    border-radius: 5px;    background-color: rgba(255, 255, 255, 0.06);    backdrop-filter: blur(20px);    text-decoration: none;    color: #fff;    display: block;    padding: 1rem;}.pcard__more:hover {    letter-spacing: 5px;    background-color: rgba(59, 59, 59, 0.3);}/***** Footer *******/.pcard__footer {    background-color: rgba(255, 255, 255, 0.06);    display: flex;    flex-direction: row;    width: 100%;    padding: 0.3rem 0;}.pcard__resultat {    padding: 0.7rem 0.5rem;    text-align: center;    flex: 1 0 50%;}.pcard__resultat:first-of-type {    border-right: 2px solid rgba(255, 255, 255, 0.08);}.pcard__score {    margin-bottom: 0.8rem;    font-size: 1.1rem;    letter-spacing: 1px;}.pcard__item {    letter-spacing: 1.5px;    color: rgb(230, 230, 230);    font-weight: normal;    font-size: 0.8rem;}.pcard__fonction,.pcard__more,.pcard__footer,.pcard__header {    transition: all ease-in-out 0.5s;}/**************** Version réduite ***********/.pcard--reduit .pcard__fonction {    transform: scaleY(0);}.pcard--reduit .pcard__more {    transform: scale(0);    transform-origin: bottom;}.pcard--reduit .pcard__footer {    transform: translateY(100%);}.pcard--reduit .pcard__header {    transform: scale(1) translateY(4rem);}/**** Version supprimée ***/.pcard--supprimee {    width: 0 !important;    height: 0 !important;    margin: 0;}

1 réponse

choubaka Messages postés 39376 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 29 avril 2024 2 101
13 mai 2022 à 12:52
Bonjour
il serait intéressant de montrer les erreurs retournées..
0
Salut, tout à fait d'accord parce que vous parlez d'erreur mais lesquelles?

Sans avoir à tester le code ça permettrait de savoir l'erreur retournée.
Vous parlez de requête mais je ne vois clairement aucune requête ou alors vous utilisez le mot à tort et à travers sans savoir ce qu'il signifie en programmation(ça serait le cas avec AJAX éventuellement qui mélange 2 ou 3 langages de programmation dont peut avoir à utiliser des requêtes, SQL est un langage de requête comme son nom l'indique).
On parle plutôt "d'instructions" si vous voulez indiquer une partie du programme en particulier(comme une ligne d'instructions) et avec JavaScript si on parle de requêtes c'est pour le DOM donc on reste dans JavaScript(requête signifiant ici d'accéder à un élément HTML = le DOM sa représentation virtuelle par JavaScript).

Bon ceci dit si vous lisez les erreurs et regardez les lignes vous comprendrez mieux, parfois ce n'est pas clair mais c'est une étape obligée pour apprendre.


Sans teste rle code je vois une erreur à la 3ème ligne:

var reapp = document.getElementsByClassName("regenerer bouton")


Regardez simplement les explications dans le manuel, vous comprendrez où est votre erreur et que c'est donc normal que le programme ne puisse fonctionner(une seule erreur et rien ne fonctionnera).

https://www.w3schools.com/jsref/met_document_getelementsbyclassname.asp

Le manuel indique clairement que ELEMENT.getElementsByClassName permet d'obtenir un tableau(une variable de plusieurs valeurs indexées à partir de 0) pour tous les éléments ayant le nom de classe en paramètre(entre les parenthèses).

Donc comme vous ne mettez pas un nom de classe mais "regenerer bouton" qui est soit le nom de 2 classes (séparées par un espace donc) soit une erreur de saisie(pour "regenererclasse" voire "regenerer_classe" ou autre chose) il est normal d'obtenir une erreur.
Un nom de classe ne pouvant contenir d'espace(qui sépare deux classes et permet donc d'avoir plusieurs classes pour un même élément comme ceci class="premiere-classe seconde-classe"
Par convention quand on soit utiliser un mot composé pour un nom de classe on peut l'indiquer par le symbole tiret "-", c'est une convention et ça rends juste l'ensemble plus simple à lire et comprendre mais pas une obligation. Écrire le nom de classe correctement l'est par contre, donc sans espace dans le nom d'une classe.

La console du navigateur est là pour vous aider, écouter ou plutôt lisez ce qui est dit (normalement indique ligne et colonne de l'erreur)ça vous aidera à corriger vos erreurs pour la peine que vous relisiez pour trouver l'erreur commise.
Et bien sûr attention aux fautes de frappe ou d’inattention.

edit: après relecture vous semblez faire appel à un fichier AJAX, donc parlez de requête AJAX ça sera plus clair si le problème vient de là(voir les états des données pour tester la requête et son résultat par exemple), ce qui ne semble pas votre seule erreur puisque déjà ligne 3 votre sélecteur par nom de classe est faux.

edit2: bien sûr vous ne faites pas appel à ce fichier... donc pas de requête dans votre code. Éventuellement puisque vous ne vous en servez pas vous le supprimez(son appel dans la page temporairement) pour vous concentrer déjà sur les erreurs que vous avez dans le code que vous montrez avant de passer à la correction du fichier: chargementAjax.js s'il contient des erreurs.
Une erreur à la fois à traiter c'est suffisant et en corriger une (dans l'ordre de haut en bas) ça réglera peut-être les problèmes qui suivent.
0
Ipoote Messages postés 45 Date d'inscription dimanche 23 septembre 2018 Statut Membre Dernière intervention 21 mai 2023 > DoctorHow
13 mai 2022 à 15:29
Merci pour ta réponse rapide et super détaillée !

C'est bien d'instruction que je parle alors, autant pour moi, je pensais que le mot requête était aussi correct.
Je n'en suis pas encore au AJAX je n'ai donc pas encore rencontré de problème quant à ce dernier..

C'est vrai que j'aurais dû détailler davantage mon erreur, celle que j'obtiens avec le code donné est la suivante :
"pcard.js:24 Uncaught TypeError: cardASupprimer.dispatchEvent is not a function
at HTMLDivElement.cacher (pcard.js:24:20)"

Je me doute bien que cela vient d'une erreur de syntaxe ou de méthode (dans le sens où j'ai peut-être mal compris l'utilisation d'une fonction par ex.), mais je ne sais pas vraiment comment régler le problème. Un ami m'a envoyé son code qui fonctionne mais a utilisé un autre moyen de parvenir à ce qui était demandé dans l'exercice, mais je voudrais quand même comprendre pourquoi le mien est faux.

Concernant le "regenerer bouton", c'est ce qui était écrit dans le HTML que l'on nous a fourni avec l'exercice, c'est pour ça que je me suis contenté de recopier la classe telle qu'elle était dans le HTML, qu'est-ce que j'aurais dû faire dans ce cas ? Écrire "regenerer-bouton" ? Parce que le contenu qui suit cette classe est exactement celui que j'ai besoin de sélectionner.

En fait je n'en suis pas encore à la partie où l'on doit utiliser AJAX, c'est pour ça qu'on le voit dans certaines parties du code mais pas partout, je ne m'en suis pas encore occupé ^^
0
DoctorHow > Ipoote Messages postés 45 Date d'inscription dimanche 23 septembre 2018 Statut Membre Dernière intervention 21 mai 2023
Modifié le 13 mai 2022 à 20:41
ça me paraît clair ça:

cardASupprimer.dispatchEvent is not a function


J'avais vu l'erreur mais comme tu parlait de plusieurs j'attendais la suite.
cardASupprimer est un objet HTMLElement. A moins d'y ajouter la fonction dispatchEvent soi-même cette fonction n'existe simplement pas.
D'ailleurs même pour l'utiliser hors objet je ne la voit pas donc dur de faire appel à une fonction qui n'existe simplement pas... et plutôt normal d'avoir une erreur.
Il faut donc soit créer la fonction soit qu'elle existe déjà dans un des fichiers .js en liens à la fin de la page HTML.

Pour regenerer bouton soit l'exercice est mal fait voire faux soit vous avez mal lu la question mais un nom de classe ne peut s'écrire avec un espace en HTML.

<p class="regenerer bouton">Faire réapparaitre</p>

indique que l'élément p à 2 classes CSS : une nommée "regenerer" l'autre nommée "bouton" et c'est ce que j'expliquais sur pouvoir en combiner plusieurs.
En JavaScript on ne peut sélectionner tous les éléments ayant la même classe(class attribut HTML) en utilisant :
ELEMENTPARENT.getElementsByClassName(NOMDELACLASSE)
Qu'il y ait 1 ou 100 éléments vous recevrez en réponse un tableau de variables.
Donc vos varaibles ne sont pas l'élément concerné directement.

L'objet document étant parent de toute la page écrire:
document.getElementsByClassName(nomdelaclasse)
sélectionne bien tout les éléments qui ont la classe voulue.

Un objet en informatique ou programmation orientée objet est un paradigme de conception.
Il consiste à regrouper des éléments(variables et fonctions) sur un thème ou une utilité précise.
Il a bien d'autres avantages mais on va se contenter de juste y accéder et laisser de côté l'aspect création et enrichissement(comme ajouter une fonction) qui ne me semble pas l'idéal sur un cours de débutant.
En JavaScript la notation pointée(avec un '.') indique que l'on accède à un objet, ou plutôt ses variables internes(nommés attributs) ou ses fonctions internes(nommées méthodes)


Donc quand vous voyez
ELEMENT.quelqueChose()
ou
ELEMENT.autreChose

Cela fait référence à ce que contient l'instance de l'objet, l'objet en cours pour simplifier.
En fait l'objet est une sorte de moule, son instance la création à partir du moule....bien sûr ce n'est qu'une image pour être plus précis tout est objet en JavaScript même les fonctions et inversement mais cela va pas vous éclairer beaucoup si vous ne savez pas utiliser correctement une fonction commencez par là:

https://duckduckgo.com/?q=les+fonctions+javascript

+ voir comment fonctionne les tableaux(Array) pour savoir comment y accéder/manipuler si vous n'êtes pas au point dessus.
0
DoctorHow > DoctorHow
13 mai 2022 à 20:49
Ah j'ai trouvé .dispatchEvent que je ne connaissais pas. Mon erreur.

https://www.javascripttutorial.net/javascript-dom/javascript-dispatchevent/

Notez que le paramètre qui doit être utilisé doit être un objet "Event" donc vous ne pouvez pas l'utiliser directement mais devez passer par l'exemple.
Pour l'instant sans l'astuce AJAX (qui fait des requêtes asynchrones au serveur) il n'y a donc pas vraiment d'intérêt à l'utiliser.
A vous de voir si vous y tenez.
0