xul tree - mazanie treeitem obcas zblbne

Rozšírenia a témy vzhľadu vyvíjané komunitou okolo Mozilla.sk
dvh
návštevník
návštevník
Príspevky: 32
Dátum registrácie: 21. Apríla 2007, 19:31

xul tree - mazanie treeitem obcas zblbne

Príspevok od užívateľa dvh » 14. Mája 2008, 13:07

Pomocou document.createElement v remote stranke pridavam do tree riadky (nepouzivam tam rdf datasety). Mazem to tak ze odstranim treechildren a nanovo ho vytvorim. Tu je kod:

Kód: Vybrať všetko

function treeClear(AId) {
  var t = document.getElementById(AId);
  var tp = t.parentNode; 
  tp.removeChild(t);
  var n = document.createElement('treechildren');
  n.setAttribute('id',AId);
  tp.appendChild(n);
}
Problem je v tom ze to obcas "zblbne". Prejavuje sa to tak, ze napr. ak mam v strome 5 poloziek, vymazem ich a pridam nanovo, tak priblizne kazdy 10-ty krat sa stane to, ze namiesto 5 poloziek je tam (pocet_predoslych_uspesnych_nacitani*pocet_zobrazenych_riadkov)+1 prazdnych riadkov a az tak nasledu moje viditelne nacitane polozky. Ked kliknem na prazdny riadok, vypise to:

Chyba: uncaught exception: [Exception... "Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsITreeView.isContainer]" nsresult: "0x80070057 (NS_ERROR_ILLEGAL_VALUE)" location: "JS frame :: chrome://global/content/bindings/tree.xml :: onxblclick :: line 1059" data: no]

Co s tym? Vdaka.

Užívateľov profilový obrázok
Mazarik
Administrátor
Administrátor
Príspevky: 2706
Dátum registrácie: 29. Novembra 2005, 15:15
Bydlisko: Brno

Re: xul tree - mazanie treeitem obcas zblbne

Príspevok od užívateľa Mazarik » 14. Mája 2008, 15:34


dvh
návštevník
návštevník
Príspevky: 32
Dátum registrácie: 21. Apríla 2007, 19:31

Re: xul tree - mazanie treeitem obcas zblbne

Príspevok od užívateľa dvh » 14. Mája 2008, 15:50

Vyskusal som replaceChild ale nepomohlo. No podarilo sa mi izolovat problem (z 1400 na nejakych 100 riadkov kodu). Su to 3 subory, je tam aj navod na zopakovanie chyby (kliknut na tlacitko LOAD, kliknut na lubovolny riadok stromu, niekolkokrat znova kliknut na LOAD, u mna stacilo 3 az 11 krat, je to rozne). Chyba sa prejavuje len ak je socastou aj xmlhttprequest takze testovat to musite ako remote stranku.

tree2.xul:

Kód: Vybrať všetko

<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<window
  id="tree" title="tree"
  xmlns:html="http://www.w3.org/1999/xhtml"
  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script src="tree2.js"></script>

<label value="1. Click on LOAD button for the first time" />
<label value="2. Click with mouse on any row (e.g row #5) from the tree (this is very important)" />
<label value="3. Click on LOAD button few times (4 to 11, maybe little more)" />
<label value="4. After few clicks, content of tree will dissapear (FF 3beta5, FF 2.0.0.14)" />
<label value="5. Move above tree, scroll with mouse wheel, content will mirracly appear" />
<button label="LOAD" oncommand="nacitaj('MyTree1')" />

<tree id="MyTree1" width="320" flex="1">
  <treecols>
    <treecol label="Prvy" flex="1"/>
    <treecol label="Druhy" flex="1"/>
    <treecol label="Treti" flex="1"/>
  </treecols>
  <treechildren id="MyTree1Children">
  </treechildren>
</tree>

</window>
tree2.js:

Kód: Vybrať všetko

function treeClear(AId) {
  // vymazeme strom
  var t = document.getElementById(AId);
  var tp = t.parentNode;
  var n = document.createElement('treechildren');
  n.setAttribute('id',AId);
  tp.replaceChild(n,t); 
}

function treeFromUrl(url,parser,vars) {
  // posleme ajaxovy request
  var request = new XMLHttpRequest();
  request.open("POST", url, true);
  request.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 
  request.onreadystatechange = function() {
    if (request.readyState == 4 && request.status == 200) {
      if (request.responseText) {
        parser(request.responseXML);
      }
    }
  };
  request.send(vars);
}

function ulohaPridajBunku(ARow,AItem,AItemColumn) {
  // pomocna funkcia - pridanie jednej bunky do riadku treerow
  var tc = document.createElement("treecell"); 
  tc.setAttribute("label",AItem.getAttribute(AItemColumn)); 
  ARow.appendChild(tc);
}

function ulohaParser(xml) {
  // prijimac uloh, vytvara polozky v strome
  var grid = document.getElementById('MyTree1Children');
  var items = xml.getElementsByTagName("item");
  for (var i=0; i<items.length; i++) {
    var ti = document.createElement("treeitem");  
    var tr = document.createElement("treerow");   
    ulohaPridajBunku(tr,items[i],'alfa');
    ulohaPridajBunku(tr,items[i],'beta');
    // pridame
    grid.appendChild(ti);
    ti.appendChild(tr);
  }
}

function nacitaj() {
  // vymazeme strom a nacitame xml
  treeClear('MyTree1Children');
  treeFromUrl('tree2data.xml',ulohaParser,'');
}
tree2data.xml

Kód: Vybrať všetko

<?xml version="1.0"?>
<items>
<item alfa="1" beta="foo"/>
<item alfa="2" beta="bar" />
<item alfa="3" beta="zzz"/>
<item alfa="4" beta="yyy"/>
<item alfa="5" beta="xxx" />
<item alfa="6" beta="aaa"/>
<item alfa="7" beta="bbb"/>
<item alfa="8" beta="ccc"/>
<item alfa="9" beta="ccc"/>
<item alfa="10" beta="ccc"/>
<item alfa="11" beta="ccc"/>
<item alfa="12" beta="ccc"/>
<item alfa="13" beta="ccc"/>
<item alfa="14" beta="ccc"/>
<item alfa="15" beta="ccc"/>
<item alfa="16" beta="ccc"/>
<item alfa="17" beta="ccc"/>
<item alfa="18" beta="ccc"/>
<item alfa="19" beta="ccc"/>
<item alfa="20" beta="ccc"/>
</items>

Užívateľov profilový obrázok
Mazarik
Administrátor
Administrátor
Príspevky: 2706
Dátum registrácie: 29. Novembra 2005, 15:15
Bydlisko: Brno

Re: xul tree - mazanie treeitem obcas zblbne

Príspevok od užívateľa Mazarik » 14. Mája 2008, 18:54

A preco neumiestnite nejeky testcase na web?

dvh
návštevník
návštevník
Príspevky: 32
Dátum registrácie: 21. Apríla 2007, 19:31

Re: xul tree - mazanie treeitem obcas zblbne

Príspevok od užívateľa dvh » 14. Mája 2008, 19:10


Užívateľov profilový obrázok
Mazarik
Administrátor
Administrátor
Príspevky: 2706
Dátum registrácie: 29. Novembra 2005, 15:15
Bydlisko: Brno

Re: xul tree - mazanie treeitem obcas zblbne

Príspevok od užívateľa Mazarik » 14. Mája 2008, 19:38

Skuste toto robit synchronne alebo si zabezpecte disablovanie tlacitka load pokial bezi dotaz na server. Synchronnost zabezpecite v

Kód: Vybrať všetko

request.open("POST", url, false);
Lepsou moznostou je disablovanie tlacitka pocas nahravania. Pred

Kód: Vybrať všetko

request.send(vars);
Disablujete tlacitko a na konci funkcie

Kód: Vybrať všetko

ulohaParser(xml)
tlacitko zase povolite.
Kludne sa Vam totiz mohlo stat, ze kliknutie predbehlo nahratie a zobrazenie predchadzajucich dat, v kode toho stromu sa potom vola pravdepodobne refresh alebo reuild na view toho stromu a ten sa zavola aj vtedy ked urobite na strome nejaku udalost. Toto refreshovanie a rebuildovanie by ste museli volat pokial by ste mali strom s inym datasourcom alebo nadefinovany vlastny view.

dvh
návštevník
návštevník
Príspevky: 32
Dátum registrácie: 21. Apríla 2007, 19:31

Re: xul tree - mazanie treeitem obcas zblbne

Príspevok od užívateľa dvh » 14. Mája 2008, 20:07

Urobil som to disablovanie tlacitka ale nepomohlo to, na http://komiks.xf.cz/tree/tree2.php je nova upravena verzia ale aj tak to nejde.

Užívateľov profilový obrázok
Mazarik
Administrátor
Administrátor
Príspevky: 2706
Dátum registrácie: 29. Novembra 2005, 15:15
Bydlisko: Brno

Re: xul tree - mazanie treeitem obcas zblbne

Príspevok od užívateľa Mazarik » 14. Mája 2008, 20:47

Skuste po nahrati obsahu zavolat http://www.xulplanet.com/references/ele ... op_builder
Prinajhorsom by mohlo pomoct zavolat na strome click a hadam sa to zobrazi.
Dalej by som doporucoval problem nahlasit do bugzilla.mozilla.org Skusal som to aj v NB a nefunguje to spravne.

ps: vitajte vo svete niekedy nefunkcneho gecka:) ale co funguje na 100%, ze..

dvh
návštevník
návštevník
Príspevky: 32
Dátum registrácie: 21. Apríla 2007, 19:31

Re: xul tree - mazanie treeitem obcas zblbne

Príspevok od užívateľa dvh » 14. Mája 2008, 23:49

Nic z toho nepomohlo, nahlasil som bug, uvidime...

Užívateľov profilový obrázok
Mazarik
Administrátor
Administrátor
Príspevky: 2706
Dátum registrácie: 29. Novembra 2005, 15:15
Bydlisko: Brno

Re: xul tree - mazanie treeitem obcas zblbne

Príspevok od užívateľa Mazarik » 15. Mája 2008, 00:15

cislo bugu? ze by som sa tam pripisal..

Užívateľov profilový obrázok
caesar1987
pokročilý diskutujúci
pokročilý diskutujúci
Príspevky: 283
Dátum registrácie: 9. Mája 2006, 00:03
Bydlisko: Nové Zámky
Kontaktovať užívateľa:

Re: xul tree - mazanie treeitem obcas zblbne

Príspevok od užívateľa caesar1987 » 15. Mája 2008, 03:31

musim sa priznat ze velmi zaujimavy bug.. :D
taky maly OT :)

dvh
návštevník
návštevník
Príspevky: 32
Dátum registrácie: 21. Apríla 2007, 19:31

Re: xul tree - mazanie treeitem obcas zblbne

Príspevok od užívateľa dvh » 15. Mája 2008, 09:03


dvh
návštevník
návštevník
Príspevky: 32
Dátum registrácie: 21. Apríla 2007, 19:31

Re: xul tree - mazanie treeitem obcas zblbne

Príspevok od užívateľa dvh » 18. Mája 2008, 16:26

Podarilo sa mi vytvorit funkcny workaround, sice je to partizancina jak prasa ale co uz:

http://komiks.xf.cz/tree/tree3.php

Pointa spociva v tom ze cely tree obalim este jednym vboxom (aby sa nerozpadlo pri refreshi rozvrzenie stranky) a potom jednoducho vymazem cely strom a nanovo ho tam cely pridam.

Užívateľov profilový obrázok
Mazarik
Administrátor
Administrátor
Príspevky: 2706
Dátum registrácie: 29. Novembra 2005, 15:15
Bydlisko: Brno

Re: xul tree - mazanie treeitem obcas zblbne

Príspevok od užívateľa Mazarik » 18. Mája 2008, 17:55

Pokial ste to urobili takto, tak by som ja osobne este rozmyslal tom, ze by som cely strom obalil do stack a dal tam k tomu este div, kde budete mat nejake hybajuce sa nieco, ktore bude aktivne, ked sa bude strom nahravat. Az sa nahra, tak prepnete na strom a teoreticky by sa Vam to mohlo prekreslit.

Prog.
začiatočník
začiatočník
Príspevky: 1
Dátum registrácie: 30. Júla 2008, 15:10

Re: xul tree - mazanie treeitem obcas zblbne

Príspevok od užívateľa Prog. » 30. Júla 2008, 15:36

pre tree asi nie je velmi prirodzene ked odstranis nejaku jeho sucast, neviem, neskúšal si mazať iba položky ? zhruba takto...

var children = document.getElementById(...);
while (children.firstChild()) children.removeChild(children.firstChild());

Zamknuté