Оптимизация: определение класса hide

Давайте подробнее остановимся на предложенном мной решении. Предлагаю следующую реализацию:

function isHidden(el) {
        var p=el;
        var b=document.body;
        var re=/(^|\s)hide($|\s)/;
        while(p && p!=b && !re.test(p.className))
               p=p.parentNode;
        return !!p && p!=b;
}

Предполагается, что корневые элементы DOM скрывать не имеет смысла и поэтому проверки ведутся только до document.body.

Предложенное решение явно не спустит лавину reflow, так как никаких вычислений и измерений не проводится. Однако немного смущает проход до корня документа: что же будет при большой вложенности элементов? Давайте проверим. Тест isHidden проводится для вложенности 2 (document.body / test_div), а тест isHidden2 — для вложенности 10 (document.body / div * 8 / test_div).

IE sp62 Firefox 2.0.0.12 Opera 9.22 Safari 3.04b
offsetHeight 23500 10624 4453

5140
isHidden 231 351 70 71
isHidden2 370 792 212 118
offsetHeight vs. isHidden 102 раза 30 раз 73 раза 92 раза

Таблица 6.5. Резульаты выполнения функции isHidden. Времена приведены в миллисекундах

Как показывают тесты, даже при большой вложенности падение скорости невелико. Таким образом, мы получили универсальное решение, которое быстрее доступа к offsetHeight в 30–100 раз.