Псевдокласс :first-child и комбинатор + в IE7

Начиная с версии 7, Internet Explorer (IE) поддерживает селектор :first-child и комбинатор +, которые позволяют сделать HTML-код заметно более чистым.

Но есть ограничение: если в HTML-коде «на месте» элемента, на который указывает селектор, окажется комментарий, IE7 «запутается», и к реальному элементу, следующему за комментарием, стили уже не применятся.

В следующем примере стили к абзацам применятся во всех распространённых браузерах (в том числе IE8+), но не в IE7:

HTML:
<div>
    <!-- Комментарий перед первым элементом -->
    <p>Первый абзац.</p>
    <!-- Комментарий между элементами -->
    <p>Второй абзац.</p>
</div>
CSS:
P:first-child {color: #0f0; } /* первый дочерний абзац */
P + P {color: #00f; } /* абзац, следующий за абзацем */

К счастью, проблему можно обойти путём динамического удаления HTML-комментариев как DOM-узлов средствами JavaScript по факту загрузки HTML-страницы. Например, с помощью такой функции:

function removeComments() {
    // http://tanalin.com/blog/2011/08/ie7-css-first-child-adjacent/
    var elems = document.getElementsByTagName('*'),
        count = elems.length,
        comments = [];

    for (var i = 0; i < count; i++) {
        var elem = elems[i],
            childNodes = elem.childNodes,
            childCount = childNodes.length;

        for (var j = 0; j < childCount; j++) {
            var node = childNodes[j];

            if (8 === node.nodeType) {
                comments.push(node);
            }
        }
    }

    var commentsCount = comments.length;

    for (var k = 0; k < commentsCount; k++) {
        comments[k].removeNode();
    }

    // Принудительная перерисовка страницы для гарантированного применения стилей
    document.body.className = document.body.className;
}

Демо-страница