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.