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>