Envoyé par : jales
Date : 19/01/2007 14:45
bonjour
dans un fichier xul, je definie une listbox vide comme ceci:
<listbox id="stocks-list" flex="1" />
je la rempli ensuite, un mot par ligne, avec ce que l'utilisateur saisi:
function add_listitems(obj,li_labels,selected_index) { for (var i in li_labels){ var li=document.createElement('listitem'); li.setAttribute('label', li_labels[i] ); li.setAttribute('flex', '1' ); obj.appendChild(li); if ( i == selected_index ) { li.setAttribute('selected', 'true' ); } } }
je recupere ensuite le contenu:
function listitems_to_array(lb) { var res = [] ; for (var i = 0; i < lb.childNodes.length; i++){ var l = lb.childNodes[i].label; res.push(lb.childNodes[i].label); } return res }
et la apparait mon probleme : je recupere bien la liste, mais parfois, sur une liste longue, je recupere des serie de cases vides. par contre, juste apres ca, si je relance une seconde fois l'extraction, tout se passe bien, je recupere toutes les bonnes valeures...
est ce que qqun a une idee de par quel bout je dois prendre ce probleme ?
merci
Envoyé par : chBok
Date : 19/01/2007 15:17
En effet, c'est assez bizarre. Tes cases vides correspondent à des blancs supplémentaires ou à une valeur existante mais récupérée vide ?
Comme tu construis l'arbre DOM manuellement, je doute qu'il s'agisse d'un problème de temporisation nécessaire dans le cas de peuplement d'une liste par template.
Je note aussi que tu peuples ta liste en créant des noeuds par createElement. Essaie d'utiliser la méthode dédiée appendItem().
Envoyé par : jales
Date : 19/01/2007 16:34
les vides que je recupere ressemblent a des cases existantes mais dont le label ne serait pas attrape..
je vais tenter la creation avec la methode dediee.
en attendant, j'en profite pour fournir mon source problematique en un bloc independant, que voici:
<?xml version="1.0"?> <window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" xmlns:html="http://www.w3.org/1999/xhtml" title="Test Listbox recover" style="background-color : #dddddd" > <gird > <columns > <column /> <column /> </columns> <rows > <row align="center" > <button label="Add" oncommand="add_input('txt-to-add', 'txt-list')" /> <textbox id="txt-to-add" /> </row> <row align="center" > <button label="Content" oncommand="alert(listitems_to_array( document.getElementById('txt-list') ).join(','))" /> <listbox id="txt-list" /> </row> </rows> </gird> <script> <![CDATA[ function add_listitems(obj,li_labels,selected_index) { for (var i in li_labels){ var li=document.createElement('listitem'); li.setAttribute('label', li_labels[i] ); li.setAttribute('flex', '1' ); obj.appendChild(li); if ( i == selected_index ) { li.setAttribute('selected', 'true' ); } } } function delete_all_childs(node) { while (node.hasChildNodes()) { node.removeChild(node.firstChild); } } function fusion_listes(l_a,l_b) { var o = new Object(); for (var i in l_a) { if (l_a[i]!='') {o[l_a[i]]=null;} } for (var i in l_b) { if (l_b[i]!='') {o[l_b[i]]=null;} } var t = new Array(); for (var i in o) { t.push(i); } t.sort(); return t; } function listitems_to_array(lb) { var res = [] ; for (var i = 0; i < lb.childNodes.length; i++){ var l = lb.childNodes[i].label; res.push(lb.childNodes[i].label); } return res } function add_input(input_id, output_id) { var Ztxtin = document.getElementById(input_id); var Ztxtout = document.getElementById(output_id); var before_array = listitems_to_array(Ztxtout); var after_array = fusion_listes(before_array, [ Ztxtin.value ] ); delete_all_childs(Ztxtout); add_listitems(Ztxtout,after_array,null) } ]]></script> </window>
Envoyé par : jales
Date : 19/01/2007 16:40
j'ai modifie la fonction en utilisant appendItem comme suit, mais sans succes
function add_listitems(obj,li_labels,selected_index) { for (var i in li_labels){ // var li=document.createElement('listitem'); // li.setAttribute('label', li_labels[i] ); // li.setAttribute('flex', '1' ); // obj.appendChild(li); obj.appendItem(li_labels[i]) var last_child = obj.lastChild last_child.setAttribute('flex', '1' ); if ( i == selected_index ) { last_child.setAttribute('selected', 'true' ); } } }
un exemple de probleme : j'insere les nombres de 1 a 13 j'affiche : j'ai 2 vides je reaffiche : tout est la PS : pour moi, a partir de 10 nombres, j'ai depasse la taille de ce qui est effectivement visible dans la list box, mais comme j'insere dans l'ordre, et que je trie avant affichage, 10 11 12 et 13 ont bien ete affiches au moins une fois
Envoyé par : chBok
Date : 19/01/2007 16:48
(rien à voir, mais tu as noté <gird> au lieu de <grid> dans ton exemple)
J'ai testé ton exemple avec l'éditeur dynamique, et je n'ai pas constaté le problème que tu évoques :/
Envoyé par : jales
Date : 19/01/2007 17:22
j'ai trouve une "solution" a mon probleme
j'ia modifie le code comme suit
function listitems_to_array(lb) { var res = [] ; if ( lb.childNodes.length >= 9 ) { for (var i = 0; i < lb.childNodes.length; i++){ alert('childNodes '+i); } } for (var i = 0; i < lb.childNodes.length; i++){ var l = lb.childNodes[i].label; res.push(lb.childNodes[i].label); } return res }
si je laisse le alerte, je peux ajouter jusqu'a 9, puis visualiser le contenu, et tout se passe bien, j'ai '1,2,3,4,5,6,7,8,9'
je peux ensuite ajouter 10, et visualiser, et j'obtiens '1,10,2,3,4,5,6,7,8,9'
si je desactive le 'alert', alors tout se passe bien jusqu'a 9, mais a 10 ( la limite de la taille de ma fenetre ) j'obtiens '1,10,2,3,4,5,6,7,8,'
mais si je re-affiche qq secondes apres, je vois le 9 appraitre : '1,10,2,3,4,5,6,7,8,9'
PS: je suis sous firefox 2.0.0.1, et j'ai fait des captures d'ecran si vous voulez les voir
Envoyé par : hhf
Date : 19/01/2007 19:19
pareil, pas vu ton probleme...
Envoyé par : jales
Date : 22/01/2007 12:51
bonjour
j'ai la solution : remplacer comme suit:
//res.push(lb.childNodes[i].label); res.push(lb.childNodes[i].getAttribute('label'));
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.