manwithnoname
Новичок
Зависание IE при style.display = 'block'
php скрипт генерит JSON, который отдаёт в шаблон JS-функции, которая строит дерево
Что можно сделать, чтобы IE в этом случае не вис. Inline оставлять не приемлемо, это всё-таки дерево
php скрипт генерит JSON, который отдаёт в шаблон JS-функции, которая строит дерево
PHP:
var tree;
function buildTree(treeJSON)
{
tree = treeJSON.tree;
for (var i = 0; i <= treeJSON.tree.length; i++)
{
if (treeJSON.tree[i])
{
var cNode = document.createElement('div');
var rNode = document.getElementById('tree_' + treeJSON.tree[i].parent.toString());
cNode.setAttribute('id', 'tree_' + treeJSON.tree[i].id.toString());
cNode.style.display = ( (treeJSON.tree[i].parent) ? 'none' : 'block' );
cNode.setAttribute('class', ( (treeJSON.tree[i].parent) ? 'sub' : '') );
cNode.innerHTML = '<a href="#" onclick="treePressed(' + treeJSON.tree[i].id + ')">' + treeJSON.tree[i].title + '</a>';
rNode.appendChild(cNode);
}
}
}
function collapseNodes(id)
{
var iNode = document.getElementById('tree_' + id.toString());
if (iNode.getAttribute('id') != 'tree_0' &&
iNode.parentNode.getAttribute('id') != 'tree_0') iNode.style.display = 'none';
for (var i = 0; i < iNode.childNodes.length; i++)
{
if (iNode.childNodes[i].nodeName.toLowerCase() == 'a') iNode.childNodes[i].setAttribute('class', '');
else if (iNode.childNodes[i].nodeName.toLowerCase() == 'div') collapseNodes(iNode.childNodes[i].getAttribute('id').split('_')[1]);
}
}
function showShortDesc(nodeId)
{
var header = '';
var children = '';
for (i = 0; i < tree.length; i++)
{
if (tree[i].id == nodeId) header = '<h3>' + tree[i].title + '</h3>' + tree[i].desc;
if (tree[i].parent == nodeId) children += '<h3>' + tree[i].title + '</h3>' + tree[i].desc;
}
document.getElementById('coll_storage').innerHTML = header + children;
}
function treePressed(nodeId)
{
collapseNodes(0);
showShortDesc(nodeId);
var sNode = document.getElementById('tree_' + nodeId.toString());
while (sNode.getAttribute('id') != 'tree_0')
{
sNode.style.display = 'block';
for (i = 0; i < sNode.childNodes.length; i++)
{
if (sNode.childNodes[i].nodeName.toLowerCase() == 'div') sNode.childNodes[i].style.display = 'inline';
Если здесь 'block' вместо 'inline' IE уходит в бесконечный цикл (судя по виду), в опере/мозилле всё нормально.
else if (sNode.childNodes[i].nodeName.toLowerCase() == 'a') sNode.childNodes[i].setAttribute('class', 'act');
}
sNode = sNode.parentNode;
}
}