Давайте подробнее остановимся на предложенном мной решении. Предлагаю следующую реализацию:
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 раз.