Зависание IE при style.display = 'block'

manwithnoname

Новичок
Зависание IE при style.display = 'block'

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;
  }
}
Что можно сделать, чтобы IE в этом случае не вис. Inline оставлять не приемлемо, это всё-таки дерево :)
 

manwithnoname

Новичок
Да она уже проведена, отладка-то. Баг найден, но исправить не могу, вот в чем проблема. Не знаю как исправить :-/
 

Кром

Новичок
Что значит "не могу исправить"? У тебя что нет под рукой редактора или не достаточно прав на редактирование файлов? Другой причины я не вижу.
От style.display = 'block', IE зависать не будет, это я тебя сразу предупреждаю. Смотри в другом направлении.
 

manwithnoname

Новичок
Дык ведь зависает. :(
К тому же, если было бы неправильно, Мозилла бы тоже ругалась? Хотя бы в JS-консоль.
Проблема-таки была в style.display.

НО!
там, где отображаеца дерево, в цсс-е был прописан expression на высоту, совмещение обоих факторов и дало беск. цикл ослу.
пошел содомировать верстальщика.
:)
 

Кром

Новичок
>Проблема-таки была в style.display.

>совмещение обоих факторов и дало беск. цикл

style.display к бесконечным циклам не имеет никакого отношения. Это так, к сведенью.
 

manwithnoname

Новичок
Style.display имеет отношение к рендерингу страницы, к которому также имеет отношение вычисление expression-а в цсс. Их неразумная комбинация имеет отношение к бесконечному циклу.

Кром, не ты ли случайно -- этот жж-юзер?
 

Кром

Новичок
Их неразумная комбинация имеет отношение к бесконечному циклу.
Абсолютно верно. Кривые руки имеют отношение к бесконечным циклам.

>Кром, не ты ли случайно -- этот жж-юзер?
Да не ты. И не я, а
>имхо это Фанат
 
Сверху