Обновить

Комментарии 14

Только мне кажется, что IE здесь поступает логичнее, чем стандарт?
Вы не одиноки в своём мнении. Некоторые тоже считают, что не имеет смысла веделять в отдельные узлы то, что при рендеринге всё равно не отображается.
Однако при рендеринге может много чего не отображаться, что является вполне себе тегами. Видимость, имхо, не фактор.
Да нет, имеется ввиду как раз то, что тегами не является, а является именно непечатными символами — переносы строк, пробелы, табуляции…
Не отображается? А если h1 и p инлайновые, тоже не отображается? Или дом дерево будет генерироваться в зависимости от css?
Полностью с вами согласен.
На самом деле, если следовать стандарту, то на первый попавшийся элемент завязываться плохо, надо проверить, что мы получили (nodeType или nodeType + nodeName), и в случае чего перейти к следующему, nextSibling не такой уж дорогой (и в большинстве случаев только один будет).

Разметка может поменяться, и все накроется.

Element.prototype.getFirstChildElement = function()
{
  var result = this.firstChild;

  while( result != null && result.nodeType != document.ELEMENT_NODE )
  {
    result = result.nextSibling;
  }

  return result;
}

alert( document.getElementsByTagName('div')[0].getFirstChildElement().tagName ); // неплохо на null проверить
Код представленный мною в примере я специльно упростил для наглядности. Конечно, в большинстве случаев прийдётся использовать дополнительную проверку узла, чтоб определить является ли он экземпляром объекта Element.
Это понятно, просто привел пример, как можно избежать подобных казусов =)
когда только учил этого тоже очень не хватало
krook.org/jsdom/
мне казалось вместо tagName правильнее использовать nodeName.
Спасибо за совет, теперь и я буду использовать nodeName.
НЛО прилетело и опубликовало эту надпись здесь
tagName остался нам от DOM Level 1
Использовать его еще разрешают, но не рекомендуют.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации