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