Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# Alimenter une listbox quand il y a beaucoup de données

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.

# Re: Alimenter une listbox quand il y a beaucoup de données

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.

  • C'est bcp plus simple, (utilisation des fonctions texte php et pas js).
  • Réduction du nombre de boucle.
  • pas besoin d'utiliser des tableaux js et des splits
  • ...

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.

# Re: Alimenter une listbox quand il y a beaucoup de données

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.

# Re: Alimenter une listbox quand il y a beaucoup de données

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();

# Re: Alimenter une listbox quand il y a beaucoup de données

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.

# Re: Alimenter une listbox quand il y a beaucoup de données

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.

# Re: Alimenter une listbox quand il y a beaucoup de données

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?

# Re: Alimenter une listbox quand il y a beaucoup de données

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 ?

# Re: Alimenter une listbox quand il y a beaucoup de données

Envoyé par : anais

Date : 25/08/2008 11:14

Merci pour votre aide. Bien à vous.

# Re: Alimenter une listbox quand il y a beaucoup de données

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.

# Re: Alimenter une listbox quand il y a beaucoup de données

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

# Re: Alimenter une listbox quand il y a beaucoup de données

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.

# Re: Alimenter une listbox quand il y a beaucoup de données

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 ...

# Re: Alimenter une listbox quand il y a beaucoup de données

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

# Re: Alimenter une listbox quand il y a beaucoup de données

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.