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 :

syntaxe boucle for (was : array.filter : différence ie / fx)


Sujet :

JavaScript

  1. #1
    Membre habitué
    Avatar de Peanut
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 412
    Points : 149
    Points
    149
    Par défaut syntaxe boucle for (was : array.filter : différence ie / fx)
    Bonsoir,
    à nouveau une particularité ie/fx.

    Voici un bout de code qui permet de stocker des messages et de n'afficher que ceux d'un type donné :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Untitled Page</title>
    </head>
    <body>
     
        <script type="text/javascript">
            gFileMessages = [];   //file : table (plus ancien message en premier)
     
            function ajouteMessage(txtMsg, criticiteMsg) {
                Msg = {
                    texte: txtMsg,
                    criticite: criticiteMsg
                };
                gFileMessages.push(Msg);
            }
     
            // Ajout de la compatibilité à .filter() pour ie
     
            //This prototype is provided by the Mozilla foundation and
            //is distributed under the MIT license.
            //http://www.ibiblio.org/pub/Linux/LICENSES/mit.license
     
            if (!Array.prototype.filter) {
                Array.prototype.filter = function(fun /*, thisp*/) {
                    var len = this.length;
                    if (typeof fun != "function")
                        throw new TypeError();
     
                    var res = new Array();
                    var thisp = arguments[1];
                    for (var i = 0; i < len; i++) {
                        if (i in this) {
                            var val = this[i]; // in case fun mutates this
                            if (fun.call(thisp, val, i, this))
                                res.push(val);
                        }
                    }
     
                    return res;
                };
            }
     
            function estInfo(Msg) {
                return (Msg.criticite == 'info');
            }
     
            function estAvert(Msg) {
                return (Msg.criticite == 'avert');
            }
     
            function extraitMessages(criticiteMsg) {
                var fileMessagesSortis = [];
     
                switch (criticiteMsg) {
                    case 'info':
                        fileMessagesSortis = gFileMessages.filter(estInfo);
                        break;
                    case 'avert':
                        fileMessagesSortis = gFileMessages.filter(estAvert);
                        break;
                    default:
                        fileMessagesSortis = null;
                        break;
                }
     
                return fileMessagesSortis;
            }
     
     
            function test() {
     
                document.getElementById('div_sortie').innerHTML = '<br>';
     
                ajouteMessage('message 1', 'info');
                ajouteMessage('message 2', 'avert');
                ajouteMessage('message 3', 'info');
     
                document.getElementById('div_sortie').innerHTML += '* gFileMessages :<br>';
                for (i in gFileMessages) {
                    document.getElementById('div_sortie').innerHTML += i + ' > ';
                    document.getElementById('div_sortie').innerHTML += gFileMessages[i].texte;
                    document.getElementById('div_sortie').innerHTML += ' : ';
                    document.getElementById('div_sortie').innerHTML += gFileMessages[i].criticite;
                    document.getElementById('div_sortie').innerHTML += '<br>';
                }
                document.getElementById('div_sortie').innerHTML += gFileMessages.length + ' éléments <br>';
     
                // ---
                var tabInfo = [];
                tabInfo = extraitMessages('info');
     
                document.getElementById('div_sortie').innerHTML += '* tabInfo (extraction des Info) :<br>';
                for (i in tabInfo) {
                    document.getElementById('div_sortie').innerHTML += i + ' > ';
                    document.getElementById('div_sortie').innerHTML += tabInfo[i].texte;
                    document.getElementById('div_sortie').innerHTML += ' : ';
                    document.getElementById('div_sortie').innerHTML += tabInfo[i].criticite;
                    document.getElementById('div_sortie').innerHTML += '<br>';
                }
                document.getElementById('div_sortie').innerHTML += tabInfo.length + ' éléments <br>';
     
            }
        </script>
     
        <a href="#" onclick="test();">+++ TEST +++</a>
        <div id="div_sortie">
        </div>
    </body>
    </html>
    Le résultat est bien celui attendu, sauf qu'à l'affichage ie rajoute une ligne filter > undefined : undefined !

    Résulat Firefox 3 :
    +++ TEST +++

    * gFileMessages :
    0 > message 1 : info
    1 > message 2 : avert
    2 > message 3 : info
    3 éléments
    * tabInfo (extraction des Info) :
    0 > message 1 : info
    1 > message 3 : info
    2 éléments
    Résultat ie 6 :
    +++ TEST +++

    * gFileMessages :
    filter > undefined : undefined
    0 > message 1 : info
    1 > message 2 : avert
    2 > message 3 : info
    3 éléments
    * tabInfo (extraction des Info) :
    filter > undefined : undefined
    0 > message 1 : info
    1 > message 3 : info
    2 éléments
    Est-ce que j'ai fais une bétise à l'affichage ou y a-t-il un réel problème ?

    PS : le code de compatibilité .filter() pour ie est fourni par Mozilla, je n'y ai pas touché et j'avoue que je ne le comprends pas.

  2. #2
    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 : 54
    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
    Cela vient des boucles for / in qui listent toutes les propriétés des objets (y compris les propriétés natives et parfois inattendues).
    Il est préférable de passer par un classique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(var i=0; i<Objet.length; i++)

  3. #3
    Membre habitué
    Avatar de Peanut
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 412
    Points : 149
    Points
    149
    Par défaut
    Merci !

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

Discussions similaires

  1. [AC-2007] Syntaxe boucle for
    Par larkoup dans le forum VBA Access
    Réponses: 3
    Dernier message: 22/07/2013, 18h48
  2. boucle for sur array
    Par rebel29270 dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 10/10/2011, 16h53
  3. Syntaxe boucle for
    Par fmoriet dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 22/12/2006, 07h39
  4. [VBS][Débutant] Problème syntaxe boucle For
    Par _alex_ dans le forum VBScript
    Réponses: 2
    Dernier message: 26/07/2006, 14h26
  5. [Syntaxe] Boucle For imbriquées en 1.5
    Par Piolet dans le forum Langage
    Réponses: 5
    Dernier message: 09/01/2005, 00h49

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