Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/05/2011, 16h05   #1
Invité de passage
 
Homme
Inscription : mai 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : mai 2011
Messages : 4
Points : 1
Points : 1
Par défaut Instanciation d'un nombre inconnu d'objets image

Bonjour,

Je souhaiterais déterminer la hauteur et largeur d'un nombre inconnu d'images grâce à javascript, mais je rencontre certains problèmes.

Pour tenter de réaliser ce script, j'ai procédé comme suit :

Code :
1
2
3
4
5
6
7
8
9
for (var j = 0; j < tab.length; j++) //où tab est un tableau d'un nombre inconnu d'images url 
{
	var picture = new Image();
 
	picture.addEventListener("load", function() {
		alert(picture.width + "*" + picture.height);
	}, false);
	picture.src = tab[j];
}
Ce code marche très bien quand il n'y a qu'un seul url dans "tab", mais ça bug de plus en plus à mesure que le nombre d'url augmente.

Pour moi ça vient du fait que la boucle s'exécute sans attendre la fin du chargement de l'image précédente ce qui modifie la variable picture en cours d'utilisation. J'ai bien pensé à transformer la variable picture en un tableau de la manière suivante :

Code :
1
2
3
4
5
6
7
8
9
10
11
var picture = new Array();
 
for (var j = 0; j < tab.length; j++) 
{
	picture[j] = new Image();
 
	picture[j].addEventListener("load", function() {
		alert(picture[j].width + "*" + picture[j].height);
	}, false);
	picture[j].src = tab[j];
}
Mais, visiblement, on ne peut pas instancier d'objet image dans un tableau (le script ne marche plus du tout). Peut être faudrait il réaliser une variable qui s'incrémente dynamiquement (picture1, picture2, ...), mais je ne sais pas si c'est possible et il doit certainement exister une méthode plus "propre".

Pourriez vous m'aidez à corriger ce problème?

Merci
Jerem87 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 16h12   #2
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 007
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

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

Informations forums :
Inscription : mars 2002
Messages : 30 007
Points : 45 091
Points : 45 091
?
?
__________________
Ma page 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


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 16h33   #3
Invité de passage
 
Homme
Inscription : mai 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : mai 2011
Messages : 4
Points : 1
Points : 1
@SpaceFrog

Non, le problème n'est pas vraiment de récupérer la taille de l'image, le problème est plutôt de charger les images dans des variables différentes de manière à pouvoir récupérer les paramètres de taille (enfin à mon sens). Mon code marche très bien en l'absence de la boucle for. Si il y a 10 images et que je met ce bout de code 10 fois (avec des noms de variables incrémenté manuellement), ça marche parfaitement. Mais bon, moi, ce que je veux c'est quelque chose de dynamique, donc cette solution ne me convient pas.

Sinon, je ne pense pas que 'style' soit nécessaire dans mon cas étant donné que c'est un objet image et non un block .
Jerem87 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 16h43   #4
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 806
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : juin 2008
Messages : 13 806
Points : 35 803
Points : 35 803
Citation:
Mais, visiblement, on ne peut pas instancier d'objet image dans un tableau
si, c'est tout à fait possible, mais le problème c'est qu'au moment où le onload est déclenché, "j" a changé de valeur
Code :
picture[j].onload = function(){alert(this.width+'*'+this.height);}
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 16h44   #5
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 007
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

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

Informations forums :
Inscription : mars 2002
Messages : 30 007
Points : 45 091
Points : 45 091
Essaye ça
Code :
1
2
3
4
5
6
7
8
9
for (var j = 0; j < tab.length; j++) //où tab est un tableau d'un nombre inconnu d'images url 
{
	var picture = new Image();
	picture.addEventListener("load", function() {
	alert(picture.width + "*" + picture.height);
	}, false);
	picture.indice=j
        picture.src = tab[picture.indice];
}
__________________
Ma page 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


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 17h00   #6
Invité de passage
 
Homme
Inscription : mai 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : mai 2011
Messages : 4
Points : 1
Points : 1
@Bovino

Ah oui, c'est fort possible, mais comment je pourrais régler ce problème dans ce cas?

PS : je ne peux pas utiliser la syntaxe :

Code :
variable.onload = function() {}
car elle ne fonctionne pas avec greasemonkey, or mon script est justement un script greasemonkey. (Ou alors c'est moi qui l'ai mal utilisé, mais d'après ce que j'ai lu sur gm, c'est un addEventListener qu'il faut utiliser).

@SpaceFrog

Ça donne la même chose qu'avec le code précédent, 17*17, c'est à dire la taille de la plus petite des images, et de fait, la plus rapide à charger.
Jerem87 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 11h43   #7
Invité de passage
 
Homme
Inscription : mai 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : mai 2011
Messages : 4
Points : 1
Points : 1
Bon ben la nuit m'a porté conseil, j'ai trouvé la solution à mon problème. Il suffisait d'utiliser 'this' à la place de 'picture[j]' à l'intérieur de la fonction de l'addEventListener.

Ce qui donne plus clairement :

Code :
1
2
3
4
5
6
7
8
9
10
11
var picture = new Array();
 
for (var j = 0; j < tab.length; j++) 
{
	picture[j] = new Image();
 
	picture[j].addEventListener("load", function() {
		alert(this.width + "*" + this.height);
	}, false);
	picture[j].src = tab[j];
}
Merci de m'avoir mis sur la voie .
Jerem87 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h02.


 
 
 
 
Partenaires

Hébergement Web