Search
Write a publication
Pull to refresh

Comments 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.
Это понятно, просто привел пример, как можно избежать подобных казусов =)
мне казалось вместо tagName правильнее использовать nodeName.
Спасибо за совет, теперь и я буду использовать nodeName.
UFO landed and left these words here
tagName остался нам от DOM Level 1
Использовать его еще разрешают, но не рекомендуют.
Sign up to leave a comment.

Articles