loader pour image...

Petit nouveau ! | 6 Messages

16 oct. 2008, 16:16

Bonjour à tous !

je viens chercher un peu d'aide ou d'explications sur un système que je veut mettre en place pour une galerie photo, le but étant d'afficher une image d'attente tant que toutes les photos ne sont pas chargées.
J'arrive tout à fait à faire ce que je veut sous Firefox, mais sous IE par exemple, ou encore Safari, les photos ne s'affichent jamais...

Code : Tout sélectionner

listImg = function(action){ var imgs = document.getElementsByTagName('img'); var loaded = true; if(!action) action = 'appear'; for (var i = 0; i < imgs.length; i++) { var img = imgs[i]; var relAttribute = String(img.getAttribute('rel')); if (relAttribute.toLowerCase().match('slide_img')) { if (action == 'hide') { if (!img.complete) { img.style.visibility = 'hidden'; $('loader').style.display = 'block'; } img.onload = function() { listImg('test') }; } else if(action == 'test') { if (!img.complete) { loaded = false; } } else { img.style.visibility = 'visible'; $('loader').style.display = 'none'; } } } if(loaded && action == 'test') { listImg('appear'); } }
Mon code n'est surement pas une référence, j'ai écris ça à l'instinct, mais il n'y a que FF qui l'aime...
Mon petit doigt me dit que le pb pourrais venir du img.onload, qui serait traité différent au niveau délai par IE (ou FF)...

Je précise que cette fonction est appelée à la suite des photos, en fin de page...

A votre avis ?

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Mammouth du PHP | 19672 Messages

16 oct. 2008, 16:29

Ton petit doigt n'a pas tort : l'évènement onload est réservé à l'élément body et quelques autres mais pas sur l'élément img.

Voir ceci
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 6 Messages

16 oct. 2008, 16:56

La balise <img> est pourtant bien dans la liste !

Mammouth du PHP | 19672 Messages

16 oct. 2008, 17:00

Ha effectivement, je l'avais lu en diagonale... ben là, je n,ai aps l'explication.

Est-ce que IE t'indique une erreur JavaScript quelque part ? (Pour autant que tu aies activé cette option dans IE bien sur)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 6 Messages

16 oct. 2008, 18:27

Non, aucune erreur apparente, en mettant de alert un peu de partout, IE ne traite pas les éléments dans le même ordre que FF, est-ce que IE n'arreterait pas la fonction en cours dés qu'une image est chargée...
je dis ça au pif, je réfléchi tout haut...

Je met le lien vers la galerie : http://portfolio.nicolasb.net

Mammouth du PHP | 19672 Messages

16 oct. 2008, 18:32

En général si une erreur est rencontrée, le reste du script n'est pas exécuté du tout. Ça peut te servir comme élément de référence pour isoler le point qui bloque.

[Edit] J'ai peut-être trouvé un truc : match() attend en paramètre une expression régulière. Or ton code y affecte une chaine brute.

À tester :

Code : Tout sélectionner

listImg = function(action) { var imgs = document.getElementsByTagName('img'); var loaded = true; if (!action) { action = 'appear'; } var il = imgs.length; for (var i = 0; i < il; i++) { var img = imgs[i]; var relAttribute = String(img.getAttribute('rel')); var reg1 = new RegExp("(slide_img)","gi"); if (relAttribute.match(reg1)) { if (action == 'hide') { if (!img.complete) { img.style.visibility = 'hidden'; $('loader').style.display = 'block'; } img.onload = function() { listImg('test'); }; } else { if (action == 'test') { if (!img.complete) { loaded = false; } } else { img.style.visibility = 'visible'; $('loader').style.display = 'none'; } } } } if (loaded && action == 'test') { listImg('appear'); } };
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 6 Messages

16 oct. 2008, 19:32

merci beaucoup pour tes efforts. Alors non, même sous IE, cette partie est bien exécutée et et les images trouvées. ça ne vient donc pas de là.
C'est désespérant !

Mammouth du PHP | 19672 Messages

16 oct. 2008, 19:36

Es-tu bien certain d'avoir activé l'affichage des erreurs de scripts dans IE ???
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
AB
ViPHP | 5818 Messages

16 oct. 2008, 21:23

Ton petit doigt n'a pas tort : l'évènement onload est réservé à l'élément body et quelques autres mais pas sur l'élément img.

Voir ceci
Oui j'aurais eu la même réflexion surtout que je n'utilise pas la même source de référence
http://fr.selfhtml.org/javascript/langa ... htm#onload

Petit nouveau ! | 6 Messages

16 oct. 2008, 21:40

hum, en effet selon SelfHTML, c'est pas bon...
Quelle alternative alors ?

ViPHP
AB
ViPHP | 5818 Messages

16 oct. 2008, 22:20

J'sais pas, je vois pas comment ton code fonctionne :-k
Disons que je m'y serait pris autrement. Un topic qui devrait peut-être t'aider
http://www.phpfrance.com/forums/voir_re ... php#249573
On vérifie le chargement des images avant de déclencher un évènement...

Petit nouveau ! | 6 Messages

16 oct. 2008, 23:14

Voila comment le script fonctionne :
Les images sont chargées dans un div via ajax, dans ce mê^me div, j'appel ma fonction avec la valeur 'hide', ce qui à pour effet de masquer les photos, et d'afficher l'image d'attente (ça sa fonctionne partout).
Dans ce premier passage, le img.onload doit (théoriquement) dire d'appeler la fonction pour vérifier si les photos sont chargées img.complete, si après la boucle, toutes les photos sont chargés, on appel la fonction une dernière fois pour passer les photos en visible et cacher l'image d'attente. La séquence tourne comme une horloge sous FF, y'a-t'il éventuellement un problème de délai avec IE ?