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 :

Affichage d'une page en 2 temps


Sujet :

JavaScript

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 167
    Points : 61
    Points
    61
    Par défaut Affichage d'une page en 2 temps
    Bonjour,

    Sur mon site j'ai une page "product" chargé d'afficher un produit demandé par l'utilisateur. Une requête est envoyée au serveur qui retourne les données du produit et le produit s'affiche.
    Le problème est que cette page s'affiche en 2 temps. 1er temps, elle s'affiche avec la structure de la page, 2ème temps elle affiche la structure avec les données du produit correctement.
    Nom : freegifmaker.me_2iVdJ.gif
Affichages : 109
Taille : 94,9 Ko
    Comment faites vous pour éviter ce genre de problème ?

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 351
    Points : 15 697
    Points
    15 697
    Par défaut
    si on regarde par exemple le titre du produit qui s'affiche dans le 2e temps, est ce que ce titre est dans le code html ou alors c'est du code javascript qui va par exemple faire une requete http en plus et ensuite afficher le titre ?

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 167
    Points : 61
    Points
    61
    Par défaut
    s'est javascript qui charge le contenu dans les balises html, don le titre du produit.

    voici la requête :
    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
    const fetchProductData = () => {
      fetch("/get-products", {
        method: "post",
        headers: new Headers({ "Content-Type": "application/json" }),
        body: JSON.stringify({ id: productId }),
      })
        .then((res) => res.json())
        .then((data) => {
          return new Promise((resolve, reject) => {
            setData(data);
            resolve();
          });
        })
        .then(() => {
          return getProducts(data.tags[1]).then((data) => createProductSlider(data, ".container-for-card-slider", "similar products"));
        })
        .catch((err) => {
          location.replace("/404");
        });
    };
    S'est les fonctions setData() et getProducts() qui doivent prendre trop de temps. setData() distribue les données dans le html. getProducts() affiche un slider en dessous de la fiche produit. D'un autre côté, l'URL de cette page "produit" associé à son ID est déclenchée immédiatement après avoir cliqué sur sa mini carte produit.
    Mon idée serait d'attendre la fin du traitement de fetchProductData () avant d'afficher la page. Par exemple avec une nouvelle promesse...
    Et sur le chargement de la page, je pourrais peut-être faire quelque chose dans ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    window.addEventListener("load", () => {
      if (location.pathname != "/products") {
        productId = decodeURI(location.pathname.split("/").pop());
        fetchProductData().then(() => {
          location.href = `products/${productId}`;
        });
      }
    });

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 351
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 351
    Points : 15 697
    Points
    15 697
    Par défaut
    "location.href" va recharger la page et donc toutes les variables javascript seront vidées.

    ce que j'ai souvent vu pour votre souci est qu'au début de la page, vous affichez un message d'attente et vous cachez le reste. et une fois que toutes les données sont mises en place, vous affichez toute la page.
    regardez cela par exemple :
    https://ihatetomatoes.net/create-cus...oading-screen/

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 167
    Points : 61
    Points
    61
    Par défaut
    ça fonctionne bien.
    Thanks
    Nom : freegifmaker.me_2iVhT.gif
Affichages : 69
Taille : 89,6 Ko

  6. #6
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 351
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 351
    Points : 15 697
    Points
    15 697
    Par défaut
    au sujet de votre code javascript, je voulais aussi rajouter que vous pouvez le simplifier comme cela (si "setData" est synchrone si j'ai bien compris)
    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
    16
    17
    const fetchProductData = () => {
     
    	fetch("/get-products", {
    		method: "post",
    		headers: new Headers({ "Content-Type": "application/json" }),
    		body: JSON.stringify({ id: productId }),
    	})
    		.then(res => res.json())
    		.then(data => {
    			setData(data);
    			return getProducts(data.tags[1]);
    		})
    		.then(produits => createProductSlider(produits, ".container-for-card-slider", "similar products"));
    		.catch(err => location.replace("/404"))
    	;
     
    };

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

Discussions similaires

  1. [ImageMagick] getimagesize qui fait ralentir le chargement d'une page ?
    Par Death83 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 18/10/2005, 20h08
  2. arret de chargement d'une page
    Par manaboko dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 04/10/2005, 12h59
  3. [iframe]pb de chargement d'une page
    Par Destampy dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 26/05/2005, 11h19
  4. Chargement d'une page
    Par krfa1 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/05/2005, 09h53
  5. [JSP] pbl chargement d'une page JSP
    Par Shiryu44 dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 30/03/2005, 10h49

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