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 :

[IE6] Optimiser création des éléments


Sujet :

JavaScript

  1. #1
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut [IE6] Optimiser création des éléments
    Bonjour,

    j'ai un petit souci avec le moteur Javascript de IE6...

    En effet, je souhaite créer une dizaine de milliers de cellules de tableau (td), j'ai donc testé plusieurs méthodes et j'aimerai savoir s'il y en a une plus optimale encore.

    Pourquoi? Parce que IE6 est super lent. Là ou Chrome / FF mettent 1 à 3 secondes, IE en met une bonne vingtaine.

    Je suis passé par Prototype au départ mais j'ai vite abandonné, plus d'une minute sur IE

    Voici donc la solution que j'ai adopté :

    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
     
    var table = document.createElement('table');
    var tbody = document.createElement('tbody');
     
    table.appendChild(tbody);
     
    var trTemplate = document.createElement('tr');
    var tdTemplate = document.createElement('td');
     
    for(var i = 0; i < 100; i++) {
    	var tr = trTemplate.cloneNode(false);
    	tr.id = i;
     
    	for(var j = 0; j < 500; j++) {
    		var td = tdTemplate.cloneNode(false);
    		td.id = i + '_' + j;
    		td.innerText = i + '_' + j;
     
    		tr.appendChild(td);
    	}
    	tbody.appendChild(tr);
    }
    document.body.appendChild(table);
    Ceci n'est qu'un exemple simplifié bien sûr mais reflète bien ma problématique.

    J'ai fais le test en faisant un createElement par boucle, mais c'est se tirer une balle dans le pied. C'est donc comme ça que je suis venu a utiliser cloneNode.

    Petites précisions :
    • me dite pas de changer de navigateur, vous perdez votre temps, c'est impossible
    • A faire en JS car le faire en PHP mettrait le serveur à genou étant donné qu'à terme, il y aura une bonne dizaine de connexions simultanées au serveur




    P.S : Test Chrome : 700ms ; Test IE8 : 8 secondes
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  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
    Billets dans le blog
    20
    Par défaut
    Salut !

    De mémoire, il me semble que inserRow et insertCell sont plus optimisés que createElement pour les tables.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Invité
    Invité(e)
    Par défaut
    jour

    je vient d'essayer de cette facon

    amd x2 4200+

    sur ff j'obtient environ 6 secondes sur ie 8 dix secondes

    pas essayer sur ie 6 j'ai ie texter et sa a bugue

    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
    <!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>
    <script language="JavaScript" type="text/javascript">
     
    function ttb(){
    var tbs=document.getElementById("tabsee")
    for(var i=0;i<100;i++){
    tbs.insertRow(0)
    tbs.rows[0].id=i
     
    for(var j = 0; j < 500; j++) {
    tbs.rows[0].insertCell(j)
    tbs.rows[0].cells[j].id= i + '_' + j;
    tbs.rows[0].cells[j].appendChild(document.createTextNode(i + '_' + j));
    }
    }
    }
    </script>
    </head>
    <body onload='ttb()'>
    <table id='tabsee'>
    </table>
    </div>
    </div>
    </body>
    </html>

  4. #4
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Salut !

    De mémoire, il me semble que inserRow et insertCell sont plus optimisés que createElement pour les tables.
    Salut !

    J'ai essayé aussi, mais détrompe toi, c'est largement pire avec insert[Row|Cell]. La preuve, j'ai jamais eu la patience d'attendre la fin de l'exécution du script (), soit > 2 minutes...

    Pour info : j'ai utilisé le code suivant :

    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
    var table = document.createElement('table');
    var tbody = document.createElement('tbody');
     
    table.appendChild(tbody);
     
    var trTemplate = document.createElement('tr');
    var tdTemplate = document.createElement('td');
    //tdTemplate.innerText = '1';
    var deb = new Date();
     
    for(var i = 0; i < 100; i++) {
            var tr = tbody.insertRow(i);
    	tr.id = i;
     
    	for(var j = 0; j < 500; j++) {
                    var td = tr.insertCell(j);
    		td.id = i + '_' + j;
    		td.innerText = i + '_' + j;
    	}
    }
    document.body.appendChild(table);
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  5. #5
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    Citation Envoyé par mekal Voir le message
    jour

    je vient d'essayer de cette facon

    amd x2 4200+

    sur ff j'obtient environ 6 secondes sur ie 8 dix secondes

    pas essayer sur ie 6 j'ai ie texter et sa a bugue

    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
    <!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>
    <script language="JavaScript" type="text/javascript">
     
    function ttb(){
    var tbs=document.getElementById("tabsee")
    for(var i=0;i<100;i++){
    tbs.insertRow(0)
    tbs.rows[0].id=i
     
    for(var j = 0; j < 500; j++) {
    tbs.rows[0].insertCell(j)
    tbs.rows[0].cells[j].id= i + '_' + j;
    tbs.rows[0].cells[j].appendChild(document.createTextNode(i + '_' + j));
    }
    }
    }
    </script>
    </head>
    <body onload='ttb()'>
    <table id='tabsee'>
    </table>
    </div>
    </div>
    </body>
    </html>
    Ce code ne répond pas à mes attentes, il construit les lignes de manières inverses, (99 à 0), hors je souhaite l'inverse

    J'ai donc fait un insertRow(i), et je retombe bien sur le post précédent, à savoir au delà de mes limites
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  6. #6
    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
    Billets dans le blog
    20
    Par défaut
    Arf... désolé
    En dernier recours, peut-être que la création d'une chaine contenant ton tableau puis l'insertion par innerHTML ira plus vite.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  7. #7
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Arf... désolé
    En dernier recours, peut-être que la création d'une chaine contenant ton tableau puis l'insertion par innerHTML ira plus vite.
    Déjà tenté aussi

    Trop long

    IE de m*rde !
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  8. #8
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour,
    innerText n'est pas cross-browser.
    SpaceFrog a remarqué sur la contribution " Construire un grand tableau plus rapidement" que
    Citation Envoyé par SpaceFrog Voir le message
    cloneNode est plsu rapide que le createElement
    .

  9. #9
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    Je vénère cette grenouille venue d'ailleurs !



    Je pense donc que je ne peux pas faire mieux...

    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 09/06/2010, 10h08
  2. [DOM] Création d'éléments DOM - Pb IE6
    Par brazilia28 dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 22/07/2008, 15h13
  3. Réponses: 4
    Dernier message: 03/12/2007, 16h28
  4. [AJAX] Création d'éléments de formulaire à partir des choix
    Par Drummkit dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 11/02/2007, 12h26
  5. Réponses: 7
    Dernier message: 24/10/2006, 11h11

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