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 :

Explication de code avec la fonction map


Sujet :

JavaScript

  1. #1
    Expert éminent

    Avatar de mlny84
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    4 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 4 023
    Points : 8 107
    Points
    8 107
    Par défaut Explication de code avec la fonction map
    Bonjour,

    Je suis chargée de continuer une application développée par une autre personne. Je suis actuellement entrain de "débugger" le programme, et je bloque sur une partie de code JavaScript...
    En gros j'ai un formulaire :

    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <form method="post" onsubmit="JavaScript:initIndexation();" action="" name="formulaire" id="formBiblio">
    	Fichier (XML ou ZIP) :
        <input id="fichier" name="fichier" type="file"/>
        <br>
    <input type="submit" name="submit" value="Importer"/>
    </form>

    et ma fonction JS :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function initIndexation() {
    	// récupérer tous les noms de fichier et les mettre dans un tableaux
    	var files = $$('.file').map(function(elt){
    			return elt.innerHTML;
    		});
    if(files.length > 0) { //blabla ça marche
    }
    else{
    //blabla message d'erreur (fichier non valide)
    }
    }
    Le problème, c'est que quand je fais tourner le programme, j'ai files.length = 0, donc je me retrouve dans le cas du else, et j'ai un joli message d'erreur. Pourtant, c'est un bien un fichier XML que je passe en paramètre.

    Etant débutante en JS, j'ai essayé de me renseigner sur la fonction map, qui semble permettre de mettre dans un tableau les résultats de la fonction.

    La fonction innerHTML semble permettre de modifier une partie du contenu d'une page après son chargement. Bon admettons, même si je ne comprends pas trop pourquoi on fait ça...

    En ce qui concerne le $$('.file') , là le mystère reste entier, je n'ai pas encore vu de $ en JS... (ai-je mal cherché ?)

    En tout cas, toute aide est la bienvenue si vous comprenez ce code...

  2. #2
    Expert éminent

    Avatar de mlny84
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    4 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 4 023
    Points : 8 107
    Points
    8 107
    Par défaut
    Bonjour,

    Je sais qu'il y a beaucoup de posts sur cette partie du forum, mais il n'y a personne pour m'expliquer ce que peut signifier ??? Et le pourquoi de l'utilisation des $$ ? Je pense que c'est à cause de cela que mon programme ne fonctionne pas, puisque la variable files est vide...
    Un simple lien vers une explication ou une début d'explication pourra m'aider...

    Le formulaire prend en paramètre un fichier qui peut soit être un zip qui contient plusieurs fichier XML, soit un seul fichier XML. Le début de la fonction initIndexation sert à mettre l'ensemble des fichiers dans un tableau files. Si le tableau est vide (files.lenght = 0) alors on envoie un message d'erreur, sinon on peut indexer les fichiers.

    Le code entier est assez compliqué (j'ai des fichiers xsl, xsp, js, ...) et tourne à l'aide de la plateforme Java SDX (Cf ce post si vous voulez plus de détails sur cette application : http://www.developpez.net/forums/sho...d.php?t=420947), mais je pense que le problème vient de la partie du code JavaScript que je vous ai donné.

    Merci d'avance pour le moindre début d'aide que vous pourrez m'apporter, car je suis à court d'idées...
    Mlny.

  3. #3
    Expert éminent

    Avatar de mlny84
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    4 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 4 023
    Points : 8 107
    Points
    8 107
    Par défaut
    Je continue de me m'arracher les cheveux sur mon problème...
    J'ai essayé de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    var files = $$('.file').map(function(elt){
    			return elt.innerHTML;
    		});
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	var files = new Array();
    	files[0] = fichier;
    	for(i=0;i<files.length;i++){
    	files[i] = files[i].innerHTML;
    	}
    En me disant que j'allais tester pour un fichier XML (je laisse tomber les ZIP pour le moment...), mais au lieu d'être dans le cas du if ou du else, l'application s'arrête, la page ne finie pas de se charger...

    Quelqu'un a une idée sur l'erreur que j'ai commise? Car les 2 codes ne sont pas équivalents...

  4. #4
    Expert éminent

    Avatar de mlny84
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    4 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 4 023
    Points : 8 107
    Points
    8 107
    Par défaut
    Bonjour,

    Mon monologue continue... (si vous voulez intervenir, n'hésitez pas !)
    J'ai continué mes recherches, et il semblerait que $() appartienne la bibliothèque prototype et que $() soit un raccourci vers document.getElementById()
    J'ai finalement pu trouver quelques explications sur le $$('.file')
    D'après ce lien (en anglais) : http://www.prototypejs.org/api/utility/dollar-dollar, on a les exemples suivants :
    $$('div');
    // -> all DIVs in the document. Same as document.getElementsByTagName('div')!

    $$('#contents');
    // -> same as $('contents'), only it returns an array anyway.

    $$('li.faux');
    // -> all LI elements with class 'faux'
    Je suppose donc que $$('.file') doit représenter l'ensemble des fichiers du document..., non?
    Pourtant, j'ai toujours mon files.length = 0
    J'ai testé en mettant $$('file') (sans le .), cela me donne exactement la même chose...
    Quelqu'un a une idée du pourquoi mon code (Cf 1er post) ne marche pas ???
    svp

  5. #5
    Expert éminent

    Avatar de mlny84
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    4 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 4 023
    Points : 8 107
    Points
    8 107
    Par défaut
    Bon, je continue de réfléchir...

    Il y a une deuxième interprétation pour le $$('.file')...
    En effet, voici une partie du code qui correspond à mon fichier xsp :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    </xsp:logic>
    <snd:file><xsp:expr>file.getName()</xsp:expr></snd:file>
    <xsp:logic>
    et une partie du code de mon fichier xsl :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <xsl:for-each select="snd:file">
    <span class="file"><xsl:value-of select="text()"/></span>
    </xsl:for-each>
    Donc avec le JavaScript derrière (fichier js, cf premier post), le $$('.file') pourrait correspondre à l'ensemble qui appartient à la classe "file".

    Sinon, j'ai bel et bien un fichier prototype.js avec mes fichiers JavaScript, et il est bien importé, donc pourquoi cela ne marche pas ???

    La moindre petite piste ou réponse de la part de quelqu'un pourrait m'aider énormément, merci.

  6. #6
    Expert éminent

    Avatar de mlny84
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    4 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 4 023
    Points : 8 107
    Points
    8 107
    Par défaut
    Je ne sais pas si ça intéressera quelqu'un (à part peut être Celira ), mais je poste quand même la solution à mon problème.

    J'ai donc enfin fini par comprendre d'où venait le problème : non pas de mon fichier JS (donc tout le code précédemment cité est bon, si vous voulez le réutiliser...) mais d'une condition de mon fichier xsp (je ne vous ai pas mis le code de tout mes fichiers, sinon il y en aurait eu pour des pages, et pour moi le problème venait du JS) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if(file.getName().matches("^\\d{10}\\.xml$"))
    En m'aidant de ce document, j'ai pu comprendre que le fichier XML devait avoir comme titre 10 chiffres exactement (ex : 1234567890.xml), et donc les fichiers que j'essayais d'importer ne marchait pas, le programme ne passait pas dans la condition, et mon tableau files était vide...

    Dommage qu'on ne m'ai pas donné de monde d'emploi, ça m'aurait évité bien des soucis...

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

Discussions similaires

  1. Explication de code avec fork
    Par Nymar dans le forum C
    Réponses: 8
    Dernier message: 18/03/2013, 14h07
  2. Réponses: 0
    Dernier message: 18/03/2011, 16h10
  3. [code::blocks] Créer une dll avec des fonctions en C
    Par dewey01 dans le forum Code::Blocks
    Réponses: 0
    Dernier message: 29/09/2008, 15h24
  4. Problème de fonction "const" avec une std::map
    Par Clad3 dans le forum SL & STL
    Réponses: 3
    Dernier message: 02/01/2007, 12h38
  5. Réponses: 2
    Dernier message: 17/05/2006, 11h43

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