Bonjour, Je suis actuellement entrain de développer une petite application avec TideSDk developper. J'utilise Javascript et je suis confronter à un problème. Lorsque j'essaye de récupérer une propriété d'un objet il m'indique undefined alors que la propriété existe bien et possède bien une valeur (voir le résultat après les fichier). **[u]voici L'objet MapGenerator qui contient plusieurs autres Objet Tilesets :[/u]** [code] var MapGenerator = function MapGenerator() { // récupération du fichier de config var config_file = Ti.Filesystem.getFile(Ti.Filesystem.getResourcesDirectory(), '/config/mapGenerator.json'); this.config = this.loadJson(config_file); // récupère les différentes Tilesets existant. this.tilesets = this.loadTilesets(); // Création des différents Tilesets dans la sideBar this.createWidgetsTileset(); } MapGenerator.prototype = { loadTilesets : function (){ var tilesets_dir, all_tilesets, tile_url, tilesets; tilesets_dir = Ti.Filesystem.getFile(Ti.Filesystem.getResourcesDirectory(), this.config.tilesets.Directory); all_tilesets = tilesets_dir.getDirectoryListing(); tilesets = []; for (var i = 1;i
'); } return tilesets; },createWidgetsTileset : function (){ var tilesets, nameTileset, tileset, nb_Tieles, _self; _self = this; tilesets = _self.tilesets; for (var i = 0; i '; } } [/code] Voici le résultat des debug à la ligne 38 de MapGenerator : [img]http://image.noelshack.com/fichiers/2014/42/1413305434-capture-d-ecran-2014-10-14-a-18-49-02.png[/img] Je n'arrive pas à comprendre, on voit bien que l'attribut existe et possède une valeur mais impossible de récupérer la valeur :(. Si quelqu'un un peu plus compétent que moi en Javascript peut m'expliquer la raison. je le remercie d'avance.

8 réponses


Bonjour

un console.log(tilset.getLargeur()) ?

ksta
Auteur

Avec getLargeur() même résultat :

J'arrive pas à comprendre pourquoi si je fait la même chose avec name ça marche mais pas avec width et height :(

héhé ptet que c'est un problème de différé avec le chargement de l'image ça m'est arrivé en faisant une galerie aussi, j'utilisais une solution un peu aléatoire (z'aime beaucoup) mais efficace: un setTimeout(func,100) avec un délai court juste pour être sur que tout soit chargé... Sinon tu testes clientWidth (taille affiché dans ton navigateur) ou naturalWidth (taille réel). Bon chance

ksta
Auteur

Merci de ton aide.

Mais je n'arrive pas trop à comprendre ou je doit mettre le setTimeout? Dans la class MapGenerator ou Tileset?

Le problème est que mes image je ne les affiches jamais. En faite je garde l'image dans une propriétée puis par la suite je découpe ces images en carré de 32px.

Est ce que cela change si l'on n'affiche pas les images?

Si l'image n'est pas afficher tu ne peux pas récupéré les proportions si tu as un serveur PHP sous la main tu peux faire un ajax pour récupéré tes dimensions facilement ça te fera un mini API par exemple:
Appel sur monGetSizerPhp.php?image=monimage.jpeg

$size = getimagesize($_GET'image']);
echo json_encode($size);

Ah maintenant que j'y pense un préchargement JS ou tout simplement CSS pour tes images devrais faire l'affaire aussi
Pour le cas du CSS

.monImage{ background-image: url(urlDeMonImage.png); height: 0; width: 0; }
ksta
Auteur

En faite j'essaye au maximum de pas utiliser PHP pour avoir une application portable sur clé USB, Mais je sais que TideSDK nous permet justement d'utiliser du PHP pour ensuite le rendre exécutable sur un système d'exploitation. Donc je vais essayer de voir sa ;)

Par contre pour le préchargement je suis intéresser également.

pour le cas du css cela ce traduit comme ceci? :

var Tileset = function Tileset(file) {

    var pathFile, ressourcesDir;

    this.name = file.name();
    // Chargement de l'image dans l'attribut image
    this.image = new Image();
    // astuce trouver sur openclassroom.
    this.image.referenceDuTileset = this;
    this.image.onload = function() {
        if(!this.complete){
            throw new Error("Erreur de chargement du tileset nommé \"" + this.name + "\".");
        }else{
            // Proptiété de l'image
            this.referenceDuTileset.width = this.width;
            this.referenceDuTileset.height = this.height;

        }

    }
    // récupération de l'url de l'image
    pathFile = file.toString();
    ressourcesDir = Ti.Filesystem.getResourcesDirectory().toString() + Ti.Filesystem.getSeparator();
    pathFile = pathFile.replace(ressourcesDir, '');

    this.image.src = pathFile; 

    // Préchargement de l'image
    this.image.style.background = "url('"+ pathFile +"')";
}

Désoler si c'est une question débutante mais c'est vrai que JS n'est pas mon langage de prédilection :D.

Merci encor pour ton aide

Pour jQuery (je ne maîtrise plus la manip du dom sans d:)

$('<img />').attr('src',pathFile).appendTo('body').css('display','none');