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 :

[DOM] Optimisation d'un datagrid editable


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 23
    Points : 22
    Points
    22
    Par défaut [DOM] Optimisation d'un datagrid editable
    Bonjour,

    Je souhaite mettre en place un datagrid editable mais j'ai quelques soucis. Le premier est que j'ai l'impression que le javascript n'est pas procédural au niveau de l'exécution des fonctions, voici 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
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    var table = document.getElementById("grid"); 
    var template = document.getElementById("template"); 
     
    function createGrid()
    {
    	$.ajax({
    		type:"GET",
    		dataType:"json",
    		url:"/monurl",
    		success:function(data) {
    			for (var i in data) {
    				createRow();				
    			}
    		}
    	});	
    }
     
    function createRow()
    {
    	tr = template.cloneNode(true);
    	table.appendChild(tr);
    }
     
    window.onload = createGrid();
    Lorsque j'execute ce type de code pour 2000 rows, il charge la page en quelques centaines de ms puis commence à exécuter la fonction createGrid(). La fonction met un certain temps à s'exécuter (30s-1min) et affiche le résultat non pas au fur et à mesure que les lignes se clonent mais tout d'un coup !
    Comment faire en sorte que les lignes s'affichent au fur et à mesure?

    J'aimerais également optimiser la création du DOM (createRow()) car je trouve ça extrêmement long pour 2000 lignes. Vaut-il mieux cloner un noeud ou bien le récréer avec les fonctions document.createElement et appendChild ?

    Finalement, si vous avez des retours d'expérience sur l'utilisation des datagrids editables comme celui de ExtJS ou bien celui de Dojo, il serait gentil d'en faire part

    Je vous remercie.

    A+

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Par défaut
    Une petite contribution pour accelerer la création de grands tableaux :

    http://www.developpez.net/forums/d47...hlight=tableau
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 23
    Points : 22
    Points
    22
    Par défaut
    Merci.

    J'ai passé une bonne partie de l'après midi à faire des tests et j'en ai conclut que faire un cloneNode(true) est environ 2x plus rapide que d'utiliser document.createElement et appendChild sur un tableau basique de 4colonnes.
    Je n'ai pas garder le code des tests mais je les referais peut-être plus sérieusement un autre jour.

    J'ai continuer mes tests avec cloneNode(true) et j'ai généré un datagrid de 2000 entrées sur 4 colonnes (réception et parsage du Json compris) en :
    - 2.5s sur Firefox 3
    - 600ms sur Chrome
    - 400ms sur Safari (mais lorsqu'il m'affiche le message d'alerte du bench le DOM n'est pas réellement chargé donc c'est suspect...)

    Sans le parsage du JSON mais juste en générant le DOM :
    - 800ms sur Firefox 3
    - 400ms sur Chrome
    - 200ms sur Safari (idem ci-dessus, DOM pas totalement chargé

    La réception du Json se fait en un peu plus de 200ms (Firebug) pour une taille de 125ko, je conclus donc que le parsage du Json prend :
    - 1.7s sur Firefox 3
    - 200ms sur Chrome
    - 200ms sur Safari

    Firefox a donc du mal à parser du Json...
    Je ne sais pas si mes tests sont fiables mais j'ai fait du mieux que j'ai pu.

    Je n'ai cependant pas trouvé comment attendre la fin d'exécution d'une fonction avant de continuer à exécuter un script. Si vous avez des pistes n'hésitez pas

    A+

  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Par défaut
    Et IE alors ?

    tiens je vais refaire mon code avec un cloneNode alors pour voir ce que ça donne ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  5. #5
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    var table = document.getElementById("grid");
    var template = document.getElementById("template");


    ne seront pas interprété dans le header car les objet n'ont pas encore été créer il te faut instancié tes variables soit après le load , soit dans après la création de tes éléments
    est ton ami fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes

    Premier ministre du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts )

Discussions similaires

  1. Datagrid editable : contrôle de saisie
    Par tafkap dans le forum Flex
    Réponses: 1
    Dernier message: 19/11/2009, 12h05
  2. datagrid editable Itemrenderer avec checkbox
    Par Cdic83 dans le forum MXML
    Réponses: 3
    Dernier message: 18/05/2009, 22h00
  3. [DOM] optimisation d'evenement onclick
    Par Zwiter dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 08/07/2008, 15h25
  4. [VB.NET 2003] DataGrid : edit = false VS. CellDblClick
    Par Kropernic dans le forum Windows Forms
    Réponses: 6
    Dernier message: 24/10/2007, 08h57
  5. CS3 Datagrid / editable / restriction
    Par bl.theus dans le forum ActionScript 3
    Réponses: 5
    Dernier message: 27/07/2007, 21h47

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