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 :

"for in" et Internet Explorer


Sujet :

JavaScript

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 423
    Points : 188
    Points
    188
    Par défaut "for in" et Internet Explorer
    Salut

    J'ai le script suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    for(var k in myArray) {
            alert(k);   //pour tester
     
            //on sort de la boucle s'il n'y a plus d'éléments
            if(!myArray[k][0]) {
                    break;
            }
     
            //ici : traitement des mes données
    }
    myArray est un tableau ayant structure suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    myArray[id1][0] = //une valeur numérique
    myArray[id1][1] = //une chaine de caractères
     
    myArray[id2][0] = //une valeur numérique
    myArray[id2][1] = //une chaine de caractères
     
    ...
    id1, id2, ... sont des valeurs numérique qui ne se suivent pas.


    Mon problème : ça ne marche pas avec IE (version 6, les autres j'ai pas essayé). Par contre pas de problème avec Firefox 2 et Opera 9.

    avec FF2 k vaut successivement :

    119
    294
    ...
    188
    each
    ->sortie de la boucle

    avec IE j'ai :

    call
    ->sortie de la boucle



    Qu'est ce que j'ai fait de faux ?

  2. #2
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    Héhé, j'ai eu le meme probleme

    En fait la structure for in ne sert qu'a scanner les proprietés d'un objet, pas à scanner les elements d'un tableau. Avant tout, un tableau javascript est un objet Array. Et ces objets comportent des propriétés et des methodes comme .length et .item().
    Tu recuperes ces propriétés et methodes quand tu fais un for in sur un Array, sous IE.

    Il serait bon de mettre ça dans la FAQ ou quelquepart...

    La solution : une bonne vieille boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     for (var k = 0; k < tab.length; k++) { alert(tab[k]); }

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 423
    Points : 188
    Points
    188
    Par défaut
    Oui, mais Array est un objet.
    D'ailleurs j'ai trouvé un exemple qui fonctionne partout et je l'ai adapté pour mon cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    var myArray=new Array();
     
    myArray['119'] = new Array();
    myArray['119'][0] = 1;
    myArray['119'][1] = 'nom 1';
     
    myArray['294'] = new Array();
    myArray['294'][0] = 3;
    myArray['294'][1] = 'nom 2';
     
    for (var propriete in myArray)
    	document.write("" + propriete + ": "+myArray[propriete][1]+ "<br>");
    Et ça fonctionne.

    Donc je pense que le problème ne vient peut-être pas du for in mais plutôt de la création de mon tableau. D'ailleurs avec l'exemple ci-dessus je n'ai pas les propriétés each, ... qui s'affichent.


    Voici déjà le pourquoi de mon script :

    J'ai sur ma page un tableau html dont chaque case contient le nom d'une ou plusieurs personnes. Une personne peut se trouver dans plusieurs cases. Un autre script me permet de sélectionner une ou plusieurs cases (une sélection se fait sur une seule colonne à la fois).

    un élément td ressemble à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <td id="td_1_2">
    <span id="pe_id_119_row_1">personne 1</span></br>
    <span id="pe_id_294_row_1">personne 1</span>
    </td>
    l'id contient l'id des personnes (pe_id) provenant d'une base de données. La partie row_# est la uniquement pour éviter d'avoir plusieurs fois le même id dans la page.


    Ensuite, dans mon script JS, je dois récupérer la liste des personnes qui se trouvent dans les cases sélectionnées ainsi que le nombre de fois qu'elles apparaissent.
    Finalement je dois éliminer du tableau JS, les personnes qu n'apparaissent pas dans toutes les cases.

    Le code complet de ma fonction :

    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
     
    var myArray = new Array();
    var tdElement = null;
    var spanElement = null;
    var splitedId = null;
    var pe_id = null;
    var nbCases = x2 - x1 + 1; //x1 et x2 sont les numéro de la première et de la dernière ligne sélectionnée
     
    //parcours des case sélectionnées
    for(var i=x1; i<=x2; i++) {        
     
        tdElement = $('td_' + i + '_' + y); //y numéro de la colonne dans le tableau html
     
        //récupération du premier enfant (soit un élément <span> (type 1), soit de type texte (type 3))
        var spanElement = tdElement.firstChild;
     
        //tant qu'on a pas atteint la dernière personne de la case
        while(spanElement != null) {
     
            //recherche d'un élément SPAN
            while(spanElement != null) {
                if(spanElement.nodeName != "SPAN") {
                    spanElement = spanElement.nextSibling;
                } else {
                    break;
                }
            }
     
            if(spanElement == null) {
                break;
            }
     
            splitedId = spanElement.id.split('_');
            pe_id = splitedId[1];
     
            //si la personne se trouve déjà dans le tableau
            if(myArray[pe_id]) {
     
                //on incrémente le nombre de fois que la personne a été trouvée dans les cases sélectionnées
                myArray[pe_id][0] = myArray[pe_id][0] + 1;
     
            //sinon on l'ajoute
            } else {
                myArray[pe_id] = new Array();
                myArray[pe_id][0] = 1;
                myArray[pe_id][1] = spanElement.firstChild.nodeValue;
            }
     
            //passage à l'élément suivant
            spanElement = spanElement.nextSibling;
        }
    }
     
    //boucle pour la suppression des personnes qui ne sont pas dans toutes les case sélectionnées
    for(var k in myArray) {
     
        //on sort de la boucle s'il n'y a plus d'éléments
        //Devrait être supprimé si tout fonctionne
        if(!myArray[k][0]) {
            break;
        }
     
     
        //si la personne ne se trouve pas dans toutes les case de la sélection, on l'enlève du tableau
        if(myArray[k][0] != nbCases) {
            myArray[k] = null;
        }
    }

    Si quelqu'un peut me dire ce qui cloche dans mon code... Parce que là je ne vois pas du tout

  4. #4
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    J'ai pas lu toute ta reponse mais si tu veux faire un tableau associatif, c'est un Object qu'il faut creer pas un Array
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    var myArray=new Object();
     
    myArray['119'] = new Array();
    myArray['119'][0] = 1;
    myArray['119'][1] = 'nom 1';
     
    myArray['294'] = new Array();
    myArray['294'][0] = 3;
    myArray['294'][1] = 'nom 2';
     
    for (var propriete in myArray)
    	document.write("" + propriete + ": "+myArray[propriete][1]+ "<br>");

  5. #5
    Membre expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Points : 3 239
    Points
    3 239
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for(var k in myArray) {
            //on sort de la boucle s'il n'y a plus d'éléments
            if(myArray[k] insatnceof Array && !myArray[k][0]) {
                    break;
            }
     
            //ici : traitement des mes données
    }

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 423
    Points : 188
    Points
    188
    Par défaut
    Citation Envoyé par Gruik
    J'ai pas lu toute ta reponse mais si tu veux faire un tableau associatif, c'est un Object qu'il faut creer pas un Array
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    var myArray=new Object();
     
    myArray['119'] = new Array();
    myArray['119'][0] = 1;
    myArray['119'][1] = 'nom 1';
     
    myArray['294'] = new Array();
    myArray['294'][0] = 3;
    myArray['294'][1] = 'nom 2';
     
    for (var propriete in myArray)
    	document.write("" + propriete + ": "+myArray[propriete][1]+ "<br>");

    C'est parfait, merci

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

Discussions similaires

  1. URL d'Internet Explorer
    Par dbourni dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 06/12/2002, 08h56
  2. internet explorer
    Par numeror dans le forum Web & réseau
    Réponses: 2
    Dernier message: 22/07/2002, 09h23

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