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 :

Une image de chargement pour un lot d'image en chargement.


Sujet :

JavaScript

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2008
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2008
    Messages : 215
    Points : 170
    Points
    170
    Par défaut Une image de chargement pour un lot d'image en chargement.
    Bonjour,

    J'ai un petit problème, je vous le présente :

    J'ai 98 images à afficher sur ma page.
    Seulement, le temps de chargement peu paraître long pour certaines connexion bas débit.

    Serait-il possible de mettre un message ou une image de chargement en attendant que les 98 images finissent toutes de se charger ?

    Merci à vous!

  2. #2
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    mieux , une image de load sur chaque image , et afficher l'image une fois chargée

  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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    j'ai déja fait ce genre de chose ...

    perso j'ai traité ça en testant dans un setInterval le complete de toutes les images

    on prend une variable flag que l'on mets à 0 en debut de boucle
    puis on boucle sur la collection document.images
    on teste le complete de chaque image et si il est true on incrémente le flag
    à la fin de la boucle on teste si le flag vaut au length de document.images
    On ajoute éventuellement un nombre max de boucle pour ne pas bloque la page

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2008
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2008
    Messages : 215
    Points : 170
    Points
    170
    Par défaut
    Merci le chomeur pour l'indication, mais l'idée de SpaceFrog me tente plus.

    SpaceFrog > J'essaye de créer ce que tu m'a dit, j'éditerais le topic à l'avenir pour présenter ce que j'ai fait, et voir éventuellement ensemble ce qui n'ira pas.

    EDIT :
    Voici ce que cela donne, et je suis un peu bloqué pour te dire :

    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
    var flag = 0;
     
    function load()
    {
    	var listImg = document.images;
     
    	for(var i = 0; i < listImg.length; i++) 
    	{
    		if(document.images[i].complete) flag += 1;
    	}
     
    	if (flag == listImg.length) /* je fait quoi maintenant ?? */
    }
     
    setInterval("load()", 500);

  5. #5
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    tu oeux par exemple au debut du lancement du setInterval rendre un div visible aves un pourcentage de chargement

    flag/images.length*100

    une fois le ration=100% tu fais un clearInterval et tu masqus le div

  6. #6
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    perso j'ai traité ça en testant dans un setInterval le complete de toutes les images

    on prend une variable flag que l'on mets à 0 en debut de boucle
    puis on boucle sur la collection document.images
    on teste le complete de chaque image et si il est true on incrémente le flag
    à la fin de la boucle on teste si le flag vaut au length de document.images
    On ajoute éventuellement un nombre max de boucle pour ne pas bloque la page
    Ce serait pas plus efficace d'incrémenter ton flag sur le onload ou oncomplete de chaque image et de ne tester que la valeur du flag dans le setInterval ?

  7. #7
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    le set interval est lancé sur le onload
    le flag est donc incrémenté et testé à la fin de chaque itération

  8. #8
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Oui, j'avais bien compris ça ! Donc à chaque itération du setInterval, tu passes en revue toute la collection Images du document, ce qui peut être un peu lourd. Ce que je propose, c'est d'incrémenter le flag sur le onload de chaque image :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <img src="image.jpg" alt="image" onload="flag++" />
    comme ça, ton setInterval (lancé lui sur le onload de la page, n'aura qu'à tester la valeur d'une variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function check(){
        if(flag==98){
            document.getElementById('overlay').style.display = 'none';
        }
    }

  9. #9
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    oui sauf q'une balise image n'as pas d'attribut onload de façon stricte

  10. #10
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Ben si justement...
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <html>
    <head>
    <title>Test</title>
    </head>
    <body>
    <img src="test.jpg" alt="test" onload="alert('toto')" />
    </body>
    </html>
    affiche bien toto
    Voir ici

  11. #11
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    ha oui tiens ...
    j'etais resté au onload uniquement sur le body
    ceci etant ça ne cahnge pas grand chose il faut tout de même faire un incrément dans un setTimout
    a la limite faire un push dans un array sur le onload de chaque image
    et tester le array length dasn un setInterval et faire un clearInterval quand le compte est bon

  12. #12
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Code php : 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
    <html>
    <head>
    <title>Test</title>
    <script type="text/javascript">
    var flag = 0, nb_img, timer;
    function init(){
    	nb_img = document.images.length;
    	timer = setInterval(function(){verif()},500);
    }
    function verif(){
    	if(flag==nb_img){
    		clearInterval(timer);
    		alert('OK, toutes les images sont chargées !');
    	}
    }
    </script>
    </head>
    <body>
    <?php
    	for($i=0; $i<100; $i++){
    		echo'<img src="test'.$i.'.jpg" alt="test" onload="flag++" />'
    	}
    ?>
    </body>
    </html>
    ça peut le faire en testant uniquement un entier

  13. #13
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    oui j'etais parti sur un push histoire de pouvoir eventuellement retracer les images chargée ou non

  14. #14
    Membre actif Avatar de nod__
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Points : 226
    Points
    226
    Par défaut
    Le truc du onload sur les images c'était une bonne idée non ? Je vois pas en quoi le setInterval est utile, rien ne change entre le chargement des images donc :
    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
    <html>
    <head>
    <title>Test</title>
    </head>
    <body>
    <?php
            for($i=0; $i<100; $i++){
                    echo'<img src="test'.$i.'.jpg" alt="test" onload="verif()" />'
            }
    ?>
     
     
    <script type="text/javascript">
    var flag = 0,
        nb_img = document.images.length;
     
    function verif () {
            flag++;
    	if (flag === nb_img) {
    		alert('OK, toutes les images sont chargées !');
    	}
    }
    </script>
    </body>
    </html>

  15. #15
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    je serais curieux de voir comment tu comptes le faire fonctionner sans setInterval ...

  16. #16
    Membre actif Avatar de nod__
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Points : 226
    Points
    226
    Par défaut
    Là par exemple, tu prends le code tu rajoutes des <img> et «ça marche™».

    Je dirais même plus, tant qu'a faire du JS autant y aller a fond :
    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
    <html>
    <head>
    <title>Test</title>
    </head>
    <body>
     
     
        <img src="http://www.decitre.fr/gi/41/9782012248441FS.gif">
        <img src="http://missdiablounette.m.i.pic.centerblog.net/37rriuxb.jpg">
        <img src="http://www.developpez.net/forums/images/logo16.gif">
     
     
    <script type="text/javascript">
    var flag = 0,
        nb_img = document.images.length;
     
    for (var i=0;i < nb_img;i++) {
        document.images[i].onload = verif;
    }
     
    function verif () {
        flag++;
        if (flag === nb_img) {
            alert('OK');
        }
    }
     
    </script>
    </body>
    </html>

  17. #17
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    En cas d'echec de chargement d'une image que se passe-t-il ?

  18. #18
    Membre actif Avatar de nod__
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Points : 226
    Points
    226
    Par défaut
    Hé bien il se passe la même chose que pour le code de Bovino, le setInterval() qui tourne à l'infini en moins.

    ( edit ) et pour le coup ça devient trivial de rajouter une fonction pour gérer les erreurs justement :
    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
    var flag = 0, errors = 0,
        nb_img = document.images.length;
     
    for (var i=0; i < nb_img; i++) {
        document.images[i].onerror = function () {
            errors++;
            this.parentNode.removeChild(this); // ou n'importe quoi
        };
        document.images[i].onload = function () {
            flag++;
            if ((flag + errors) === nb_img) {
                alert("OK. "+ (errors === 0 ? "" : errors+" erreurs"));
            }
        };
    }
    ( edit² ) si la dernière image se charge pas c'est pas glop :
    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
    var flag = 0, errors = 0,
        nb_img = document.images.length;
     
    function verif () {
        if ((flag + errors) === nb_img) {
            alert("OK. "+ (errors === 0 ? "" : errors+" erreurs"));
        }
    }
     
     
    for (var i=0; i < nb_img; i++) {
        document.images[i].onerror = function () {
            errors++;
            verif();
            this.parentNode.removeChild(this); // ou n'importe quoi
        };
        document.images[i].onload = function () {
            flag++;
            verif();
        };
    }

  19. #19
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    oui dans la solution setIntervl il suffit d'ajouter un nombre maximal d'ittérations ... ce qui revient à definir un temps maximum d'attente
    les deux solutions sont viables.

    On peut dans les deux cas afficher un pourcentage d'images chargées
    le setInterval reste pour moi plus vivant, la solution du onload des images ne declenchant la fonction que le nombre fr fois qu'il y a d'images.
    le setInterval permet un declenchement plus fréquent..
    Tout depend ensuite des operations que l'on a besoin d'effecuer pendant le chargement

  20. #20
    Membre actif Avatar de nod__
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Points : 226
    Points
    226
    Par défaut
    bah ouais, on peut toujours rajouter des trucs pour que ça marche. Même sans faire gaffe (comme la plupart des gens quand ils font du js…) y'a pas de danger que je me retrouve dans une boucle infinie.

    Je veux bien que ça marche mais franchement une méthode où il faut faire attention à ne pas tomber dans un boucle infinie pour un pauvre chargement d'images où il n'y a même pas de récursion, il y a clairement un problème.

    Après c'est au créateur du post de voir ce qui lui plaît le plus. Pour moi le js c'est événementiel, alors j'utilise les évènements. Chacun son truc

    ( edit ) le pourcentage ne bougera pas tant qu'une nouvelle image n'est pas chargée. Chargée/Erreur, on a pas plus fin. «Vivant» c'est pas raffraichir un % à la même valeur plusieurs fois par seconde.

Discussions similaires

  1. image de fond pour une JList
    Par barbiche dans le forum Composants
    Réponses: 1
    Dernier message: 04/05/2007, 12h10
  2. peut on créer une base de données pour image?
    Par adamalbert dans le forum Access
    Réponses: 3
    Dernier message: 26/05/2006, 16h10
  3. mettre une image en mémoire pour réutilisation
    Par jani dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 30/11/2005, 15h14
  4. Lien pour TELECHARGER une image plutôt que pour l'ouvrir
    Par nabab dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/01/2005, 18h07
  5. Une ProgressBar pour un rafraichissement d'image
    Par JakeGrafton dans le forum Composants VCL
    Réponses: 8
    Dernier message: 06/01/2004, 22h21

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