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 :

Page qui se recharge anormalement après un fetch


Sujet :

JavaScript

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    juin 2015
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : juin 2015
    Messages : 185
    Points : 54
    Points
    54
    Par défaut Page qui se recharge anormalement après un fetch
    Bonjour à tous !

    J'ai une page html qui contient 2 inputs non déclarés dans un formulaire (aucun formulaire dans la page). J'ai également un bouton déclaré sous forme de div.

    Un addEventListener me permet d'appeler une fonction au clic sur le bouton.

    Voici le contenu du fichier 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    const bigFile = document.getElementById('bigFile').files[0]; // Le 1er input
    const smallFile = document.getElementById('smallFile').files[0]; // Le 2e input
     
    const button = document.getElementById('button'); // Le bouton
    button.addEventListener('click', (e) => {
        e.preventDefault();
        ajout();
    })
     
    function ajout() {
        if (bigFile || smallFile) {
            if (!bigFile) {
                alert('Vous devez charger 2 fichiers image');
            }
            if (!smallFile) {
                alert('Vous devez charger 2 fichiers image');
            }
     
            const fdata = new FormData();
            fdata.append('imageUrlBig', bigFile);
            fdata.append('imageUrlSmall', smallFile);
            console.log(fdata);
     
            const head3 = {
                method: 'POST',
                body: fdata,
                headers: {'Authorization': `Bearer ${sessionStorage.token}`}
            }
     
            fetch('http://localhost:4000/api/caroussel/', head3)
                .then(reponse => {
                    if (reponse.status == 201) {
                        alert('Nouvelles images ajoutées avec succès !')
                    }
                    else {
                        return reponse.json({message: "ça ne fonctionne pas"});
                    }
                })
                .catch(e => {
                    console.log("ça n'a pas marché...")
                })
        }
    }
    Ce qui se passe c'est qu'au clic, le fetch s'exécute bien (le back reçoit bien les fichiers) mais la page se recharge avant d'afficher l'alert et le fetch semble être re-exécuté car la console affiche "ça n'a pas marché..." après rechargement. Pourtant côté back je n'ai aucune erreur, tout a fonctionné correctement.
    Comme vous pouvez le voir j'ai mis un e.preventDefault() sur le listener mais ça ne change rien.

    Vous avez une idée de ce qui se passe ?
    Merci d'avance pour votre aide !

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    juin 2003
    Messages
    9 789
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2003
    Messages : 9 789
    Points : 14 879
    Points
    14 879
    Par défaut
    mettez l'appel à fetch en commentaire pour chercher d'où vient le rechargement.

  3. #3
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    mars 2002
    Messages
    39 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2002
    Messages : 39 448
    Points : 66 233
    Points
    66 233
    Billets dans le blog
    1
    Par défaut
    Peut on voir le HTML du bouton c'est une balise a ou un div ?
    Il semble que le preventDefaut ne fonctionne pas ?
    Quelle est l'url finale ?
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

    réalisations :www.oxygen-translations.fr | www.saftair.fr | www.sistac.fr | www.sebemex.fr | www.extramiante.fr

  4. #4
    Membre éclairé
    Homme Profil pro
    Webdesigner
    Inscrit en
    juin 2014
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Associations - ONG

    Informations forums :
    Inscription : juin 2014
    Messages : 376
    Points : 747
    Points
    747
    Par défaut
    Bonjour
    Si l'élement nommé "button" est un élément button<button>mon bouton</button> alors c'est normal que la page se recharge. C'est le comportement par défaut. Il faut insérer au début de la fonction Event.preventDefault();.
    Cordialement.

  5. #5
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    décembre 2004
    Messages
    5 950
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : décembre 2004
    Messages : 5 950
    Points : 16 147
    Points
    16 147
    Par défaut
    Salut

    Par défaut <button>, si le type n'est pas précisé, est de type submit.
    En définissant le type à <button type="button"> cela éviterait le problème.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    juin 2015
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : juin 2015
    Messages : 185
    Points : 54
    Points
    54
    Par défaut
    Merci à tous pour vos réponses !

    Voici le code de mon bouton :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <div class="ajout__files__butt" id="button">Enregistrer<br>les modifications</div>
    donc à ma connaissance il n'y a pas de comportement automatique sur ce genre d'élément...

    En plus, comme on peut le voir dans le code que j'ai posté dans mon premier post, dans le doute j'ai mis un e.preventDefault() dans le listener du bouton et malgré tout la page se recharge.

    Autre élément de réponse, j'ai mis en commentaire l'ensemble du bloc fetch => pas de rechargement.
    J'ai décommenté juste la ligne de la requête fetch avec l'url (les .then restent commentés) => pas de rechargement.
    Ensuite j'ai juste ajouté .then(reponse => {console.log(reponse.status);}) => la page se recharge.
    J'ai essayé aussi un .then( () => {alert('ok')}) => la page se recharge.

    J'y comprends plus rien...

  7. #7
    Membre éclairé
    Homme Profil pro
    Webdesigner
    Inscrit en
    juin 2014
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Associations - ONG

    Informations forums :
    Inscription : juin 2014
    Messages : 376
    Points : 747
    Points
    747
    Par défaut
    Un clic sur une div n'a en effet aucune raison de recharger la page.
    Par contre, cette div utilisée comme bouton n'est pas du tout recommande pour l'accessibilité.

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    juin 2015
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : juin 2015
    Messages : 185
    Points : 54
    Points
    54
    Par défaut
    Complètement d'accord avec toi mais en l'occurence il s'agit d'une page de gestion qui sera uniquement vue et utilisée par le propriétaire du site. Donc j'ai pas forcé sur l'accessibilité. 😁

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    février 2023
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : février 2023
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour, j'ai le même problème... Vous avez trouvé d'où ca venait ?

  10. #10
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    juin 2015
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : juin 2015
    Messages : 185
    Points : 54
    Points
    54
    Par défaut
    Salut Loga7,
    à ce jour je n'ai pas trouvé de solution. Je crois que ça restera en l'état...

  11. #11
    Expert confirmé
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    juin 2006
    Messages
    2 339
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : juin 2006
    Messages : 2 339
    Points : 4 329
    Points
    4 329
    Par défaut
    il doit nous manque des infos...
    il doit y avoir un autre code qui s'execute... (qui n'a rien a voir avec ton bouton)

    as-tu essaye sur une page test, ou tu n'as QUE ce code ?

    ps : attention : le .catch() d'un fetch() ne "catch" pas les erreurs http, une reponse 404 (ou 5XX) "valide" la promesse

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <div id="go">fetch</div>
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    document.getElementById('go').addEventListener('click', go);
     
    function go() {
    	fetch('https://placekitten.com/g/200/300')
      .then(res => {
      	document.body.append('fetch ok');
      })
      .catch(e => {
      console.log(e);
      });
    }

    ce code fonctionne comme voulu.. la page ne se recharge pas
    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 !

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

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

    Informations forums :
    Inscription : janvier 2012
    Messages : 2 253
    Points : 4 418
    Points
    4 418
    Par défaut
    Bonjour,

    Je ne suis pas sûr, mais peut être que les fichiers serveurs sont sur la même racine/répertoire des fichiers clients, et que le serveur détecte des changements lors de la récupération de données et qu'il déclenche un rechargement en directe, comme c'est expliqué dans cette discussion de stackoverflow.

    La dernière réponse contient un lien pour plus de détails...

Discussions similaires

  1. Page qui se recharge automatiquement et une seule fois
    Par serna dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 20/12/2013, 10h16
  2. Page qui se recharge apres un "fwrite"
    Par __fabrice dans le forum MVC
    Réponses: 2
    Dernier message: 17/11/2009, 16h35
  3. Réponses: 4
    Dernier message: 11/05/2007, 13h02
  4. Recharger une page qui contient un recordset
    Par zooffy dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 10/05/2007, 15h35
  5. Réponses: 4
    Dernier message: 23/08/2006, 20h46

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