Envoyé par : Raphael
Date : 16/10/2006 14:34
Bonjour, voici mon problème : Je n'utilise pas RDF et ses templates car je me connecte à une base de données SQLite3. Je remplis donc un listbox de manière manuelle et en appliquant à chaque listitem certaines propriétés afin de pouvoir les filtrer facilement à l'aide de formulaires par la suite...
Voici donc ma fonction qui remplie mon listbox :
function setCardList() { var cards = getAllCards(); var liste = $("cardlist"); for (var i = 0 ; i < cards.length ; i++) { var item = document.createElement('listitem'); item.setAttribute('Card_ID', cards[i].Card_ID); item.setAttribute('Country_ID', cards[i].Country_ID); item.setAttribute('Language_ID', cards[i].Language_ID); item.setAttribute('Extension_ID', cards[i].Extension_ID); item.setAttribute('Type_ID', cards[i].Type_ID); item.setAttribute('Card_Type_ID', cards[i].Card_Type_ID); item.setAttribute('Monster_Attribute_ID', cards[i].Monster_Attribute_ID); item.setAttribute('Monster_Type_ID', cards[i].Monster_Type_ID); item.setAttribute('Monster_Subtype_ID', cards[i].Monster_Subtype_ID); item.setAttribute('Level', cards[i].Level); item.setAttribute('Atk', cards[i].Atk); item.setAttribute('Def', cards[i].Def); item.setAttribute('Description', cards[i].Description); var cell1 = document.createElement('listcell'); cell1.setAttribute('label', cards[i].Reference+" "); var cell2 = document.createElement('listcell'); cell2.setAttribute('label', cards[i].Name); item.appendChild(cell1); item.appendChild(cell2); liste.appendChild(item); } }
Jusque-là, pas de problèmes... Maintenant j'aimerais pouvoir afficher/cacher mes listitem en fonction de mon filtre. C'est a priori moins lourd que d'effacer totalement mon listbox pour le re-remplir avec les bonnes données non ?
Je voudrais donc par exemple appliquer une sorte de :
listitemàcacher.setAttribute('hidden',true);
Le truc, c'est que je ne sais pas comment accéder à mon listitemàcacher ? D'habitude, je me contente d'un getElementById(element) mais là, je ne peux pas y accéder de cette manière... En fait, je dois pouvoir y accéder par quelque chose du genre :
getElementByTag WHERE Extension_ID = '4' par exemple...
Mais je ne sais pas comment y accéder ? syntaxe ? Est-ce que ça retourne un tableau ? ou bien dois-je faire une boucle ? mais sur quoi ?
Merci d'avance pour votre aide =)
Envoyé par : laurentj
Date : 16/10/2006 18:29
bon, déjà, je trouve un peu bourrin de mettre toutes les informations en attributs : ça bouffe plus de mémoire, et c'est plus lent pour y accéder. Pourquoi ne garderais-tu pas tout dans ta variable cards ? (tu la met en globale)
et dans tes listitems, tu met juste la valeur de i.(et encore, pas besoin)
Pour cacher tes items, tu parcours ton tableau cards en verifiant les critères voulu. Pour ceux qui correspondent, tu as naturellement leur numero d'index dans le tableau, qui est en fait le numéro d'index dans la listbox. Tu as donc juste à faire un getItemAtIndex sur ta listbox pour récupérer l'item et le cacher ou le faire apparaitre..
Envoyé par : Raphael
Date : 16/10/2006 21:47
Ok... je crois que je vois ce que tu veux dire. Je fais une boucle genre for sur i et pour chaque carte, j'applique mon filtre en l'état actuel de mon formulaire, et j'en déduis si je dois afficher ou pas ma carte, c'est bien ça ? Et j'y accède grâce à un getItemAtIndex(i) ?
Ca me semble être une bonne approche =)
Sinon, comment sais-tu que mon approche bouffait de la mémoire ? Je ne suis pas très au fait de ce genre de choses. Une variable globale prend moins de mémoire que des attributs sur des listitems ?
En tous cas, merci pour ton aide, je vais essayer de coder ça dès demain...
Envoyé par : laurentj
Date : 17/10/2006 13:19
Une variable globale prend moins de mémoire que des attributs sur des listitems ?
oui je pense. et l'accés est plus rapide aussi.
Envoyé par : Raphael
Date : 20/10/2006 10:19
Ok, merci de l'info j'ai fait comme tu me le conseillais en passant ma variable en globale et en enlevant tous ces attribus...
En revanche, je me retrouve devant un problème sur des menulist. Autant, avec des listbox, avec une petite boucle du genre :
var rows = $("cardlist").getRowCount(); for (var i = 0 ; i < rows ; i++) { $("cardlist").getItemAtIndex(i); }
Je pense que j'arrive à placer des hidden sur les listitem qui répondent à mon filtre...
Autant, sur des menulist, je suis à la ramasse car je ne trouve pas de fonctions similaires aux listbox... En effet, je voudrais que certains de mes menuitem ne soient pas affichés selon les menuitem sélectionné dans d'autre menulist mais je ne parviens pas à parcourir un menulist.
Bref, j'ai l'impression que les listbox disposent de méthodes que n'ont pas les menulist et ça me pose problème...
En fait, mon problème est simple mais je ne sais pas comment le faire avec des menulist :
J'ai 2 menulist par exemple : Pays et Langues. Je voudrais pouvoir filtrer Langues en fonction du choix du Pays pour n'afficher que les langues parlées dans le pays sélectionné. Il faut donc que je parcours Langues en appliquant un attribut hidden à certains menuitem mais je n'y parviens pas.
Merci d'avance pour votre aide.
Envoyé par : laurentj
Date : 24/10/2006 11:18
Regarde dans le toolkit.jar/content/global/bindings de ton xulrunner/firefox, le code source du binding des listbox, et donc des méthodes getRowCount & cie ;-)
Sinon effectivement, il faut faire ça "à la main".
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.