Envoyé par : anais
Date : 23/08/2008 17:05
Bonjour,
Je fais une petite xul- application(ma première) et je dois remplir une listbox avec 7 colonnes. Les données sont des coordonnées de personnes c'est à dire le nom, prénom, adresse, etc...
J'utilise une base de données mysql et la table contient environs 4000 enregistrements.
L'affichage est effectué par un script js
/*fonction qui remplit unelistbox; paramètres : id de la listbox et une reponse de XMLHTTPRequest);*/ function remplirListbox(idListbox, reponseRequest) { var reg = new RegExp("[|]+","g"); var regex = new RegExp("[;]+","g"); //récupérer l'élément listbox var elem = document.getElementById(idListbox); var nbreColonnes = (elem.getElementsByTagName("listcol")).length; //ici le nombre de col = 7 //réception de la réponse dans un tableau var tableau = reponseRequest.split(reg); //séparation de chaque ligne pour en faire des items tableau.pop(); //parcourir le tableau qui contient les données des items. Tableaux length indique le nombre d'items for (var i = 0; i < tableau.length; i++) { //creer un noeud listitem var el = document.createElement('listitem'); elem.appendChild(el); tab = (tableau[i]).split(regex); el.setAttribute('label', tab[0]); //attacher les listcells for (var k = 0; k <= nbreColonnes-2 ; k++) { nouveauListCell = document.createElement("listcell"); nouveauListCell.setAttribute("label",tab[k+1]); el.appendChild(nouveauListCell); } } }
Le problème est le suivant : le script fonctionne mais il faut plusieurs minutes pour que la listbox se remplisse. C'est vraiment trop lent. Quelqu'un peut-il me conseiller ? Merci.
Envoyé par : thx1138
Date : 23/08/2008 22:47
Bonjour,
ce serait bien d'avoir ton fichier coté serveur.
Personnellement, je mets tout dans mon fichier php. Requête Ajax Post asynchrones.
Ce qui à plusieurs avantages à mon avis.
Donc ça doit être bcp plus rapide.
sinon, dans ton cas, tu peux déjà commencer par optimiser tes boucles for
Remplacez
for (var i = 0; i < tableau.length; i++)
par
for (var i = 0, T=tableau.length; i<T; i++)
Ce qui a pour avantage de ne calculer qu'une fois la taille du tableau, idem pour la deuxième boucle.
Envoyé par : anais
Date : 24/08/2008 09:53
Merci pour la réponse.
J'ai modifié cette partie en utilisant les RDF. Je gagne en performance.
<?php header("Content-type: text/xml"); $d = new DOMDocument('1.0', 'utf-8'); //creer nveau document DOM $r = $d->createElementNS("http://www.w3.org/1999/02/22-rdf-syntax-ns#", "RDF:RDF"); //creation de l'élément racine RDF avec espace de nom $r ->setAttribute("xmlns:FP", "http://www.famiplus.org/rdf#"); //second espace de nommage $d ->appendChild($r); //ajouter l'element racine au document try { //connexion à BDD FAMIPLUS $connexion = @mysql_connect(localhost,'root',''); if (!$connexion) { throw new Exception("Error while connecting to database: "); } $ressource = mysql_select_db("famiplus"); if (!$ressource) { throw new Exception("Error while selecting database: "); } $ressource = @mysql_query("SELECT IDCONTACT, NOM, PRENOM, EPOUX, ADRESSE_RUE, TELEPHONE, GSM from CONTACTS order by nom"); if (!ressource) { throw new Exception("Impossible to find data"); } $idBenef = array(); //initialiser un tableau qui contient la liste des id des beneficiaires //parcours du resultSet while ($tuple = mysql_fetch_object($ressource)){ //créer des elements ressource $e = $d->createElement("RDF:description"); $e->setAttribute("RDF:about", "http://www.famiplus.org/contacts/".($tuple->IDCONTACT)); $e->appendChild($d->createElement("FP:nom", utf8_encode($tuple->NOM))); $e->appendChild($d->createElement("FP:prenom", utf8_encode($tuple->PRENOM))); $e->appendChild($d->createElement("FP:epoux", utf8_encode($tuple->EPOUX))); $e->appendChild($d->createElement("FP:adresse", utf8_encode($tuple->ADRESSE_RUE))); $e->appendChild($d->createElement("FP:tel", utf8_encode($tuple->TELEPHONE))); $e->appendChild($d->createElement("FP:gsm", utf8_encode($tuple->GSM))); $r->appendChild($e); $idBenef[] = $tuple->IDCONTACT; } $e = $d->createElement("RDF:Seq"); $e->setAttribute("RDF:about", "http://www.famiplus.org/contacts"); $r->appendChild($e); foreach ($idBenef as $id) { $list = $d->createElement("RDF:li"); $list->setAttribute("RDF:resource", "http://www.famiplus.org/contacts/$id"); $e->appendChild($list); } } catch (Exception $e){ exit($e->getMessage()); } echo $d->saveXML(); ?>
Il me semble que FireFox garde les données en cache car la première fois la listbox fonctionne bien et après 3 essais plus rien ne va plus.
Envoyé par : Christophe Charron
Date : 24/08/2008 20:49
Bonsoir, pour "forcer" la regénération du script php, il suffit d'ajouter un argument lors de l'appel par javascript du style
"monscript.php?raf="+Math.random();
Envoyé par : anais
Date : 24/08/2008 21:07
Merci.
En fait, après avoir effectué différents tests il me semble que c'est mieux d'utiliser des templates seulement je n'obtiens pas le résultat voulu. La listbox n'est pas fluide. Firefox est à chaque fois figé quand je descends avec la scrollbar.
Quelqu'un voit-il une solution à mon problème ? ou une piste éventuellement ?
D'avance grand merci.
Envoyé par : Christophe Charron
Date : 24/08/2008 23:02
Sans vouloir plomber la soirée, il y a de sérieux problèmes avec le RDF et FF3.
Avez-vous essayé de tester le même listbox sous FF2 (pour ma part, pour faciliter la cohabitation j'utilise flock 1.2.4, identique à FF2.0.0.16) ?
Normalement, cela ne devrait pas figer sous FF2.
Envoyé par : anais
Date : 25/08/2008 08:31
Bonjour, Non je n'ai pas essayé sous FF2 car j'utilise les nouveaux éléments xul sous FF3 comme le datepicker (grid) mais je vais tester rien que par curiosité.
Merci. Avez-vous peut-être une autre piste de solution?
Envoyé par : Christophe Charron
Date : 25/08/2008 10:01
Bonjour,
espérer en la 3.0.2 !! A priori, un bug que j'avais déjà pu formaliser https://bugzilla.mozilla.org/show_bug.cgi?id=441785a été corrigé et j'espère qu'il sera intégré dans cette prochaine version.
Le problème, c'est que je sais pas comment de manière simple et claire retrouver la liste exhaustive des autres bugs rdf/ff3 dans bugzilla.
Le votre est peut-être référencé mais comment le savoir à moins de s'éplucher tout bugzilla ?
Envoyé par : anais
Date : 25/08/2008 11:14
Merci pour votre aide. Bien à vous.
Envoyé par : Christophe Charron
Date : 25/08/2008 11:33
De rien.
Faites tout de même l'essai sous FF2 et tenez-nous au courant.
Envoyé par : hhf
Date : 25/08/2008 19:25
Salut, pour presenter bcp de donnees, le tree est plus adapte, avec l'attribut flag a "dont-build-content" rapidite garantie
Envoyé par : anais
Date : 25/08/2008 20:49
Ah,oui sous FF2 il y a une sacré différence! Rien à voir avec FF3. J'ai pu charger le listbox avec 2800 enregistrements sans problèmes.
Le seul hic, c'est que j'ai déjà des applications qui fonctionnent avec FF3. Est-ce qu'il y a moyen de faire cohabiter les 2 versions?
Je dois encore faire des tests avec un élément TREE plutôt que LISTBOX. En tout cas, j'espère que cela donnera un bon résultat car je préfère rester avec une seule version de FF.
Grand merci à vous.
Envoyé par : Christophe Charron
Date : 25/08/2008 21:32
Bonsoir,
comme le dit hhf, le tree est bien plus avec "dont-build-content" est bien plus indiqué pour des gros volumes. Perso je gère tout comme cela ce qui me permet de n'avoir qu'un mode de gestion.
A ma connaissance, il n'y a pas encore moyen d'avoir le beurre et l'argent du beurre, donc pas de cohabitation de FF2 et FF3. Il faut simplement espérer que la gestion du RDF sera aussi stable dans la prochaine version mineure qu'elle ne l'était avec FF1.5 et FF2 sinon ...
Envoyé par : hhf
Date : 26/08/2008 00:31
Ais confiance, j'ai dit rapidité garantie avec le tree en mode dont-build-content... LOL
J'en ai avec plusieurs milliers de lignes. arborescent ou pas. Le seul hic c'est que arborescent, les nœuds sont fermes
Envoyé par : anais
Date : 27/08/2008 19:59
J'ai fais les changements avec un élément TREE. Visuellement il n'y a pas de différences avec LISTBOX. Pour la rapidité, impecc! Grand merci pour vos réponses.
p.s. en plus je garde FF3!
Il n'est plus possible de poster des messages dans ce forum.
Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.
Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™
sont des marques de la fondation Mozilla.