Одноразовый expression
06 Dec, 2007Все уже часто сталкивались с специфическими для IE expressions, однако не все знают (я например не знал), что их можно оптимизировать. Об одном из приемов и пойдет дальше речь.
Проблема
Наверняка многие хакеры замечали, что когда expression становится много, то сайт начинает притормаживать в IE. Оно и понятно — они ведь исполняются при каждом действии на странице, будь то клик, наведение мышки, или ресайз экрана. Cмотрите сами. Для некоторых скриптов так и должно быть (min-width например), другим же достаточно одного выполнения(PNG fix, :first-child etc). О том как заставить их исполняться только один раз при загрузке и идет дальше речь.Решение
Все решения используют один и тот же прием. Есть некий "флаг", при наличии которого expression выполняется, скрипты же пытаются при первом же исполнении этот флаг убрать.Вариант решения
Первый вариант выглядит так:- jscript: expression(
- this.p ? 0 : (
- //а здесь пишем нужный нам код,
- this.p = 1
- )
- );
this.p = 0
. Что гораздо быстрее любых других операций.
Яндекс вариант
Вариация(false true переставили местами) на тему этого способа используемая в верстке Яндекса:- b:expression(
- !this.a?
- (this.a=1, (this.previousSibling?this.innerHTML=' ·' + this.innerHTML:0)):
- 0
- );
Второй тип, я использую
Есть и второй тип, используется CSS свойство, которое потом в самом expression "сбрасывается", так, что expression при первом выполнении как бы "удаляет" сам себя:- background-image:expression(
- this.runtimeStyle.backgroundImage = 'none',
- //а здесь пишем нужный нам код
- );
background-image
тут играет лишь роль флага, на самом деле скриптить таким способом можно все, что вам нужно, как-то так выглядит эмуляция :first-child:
- background-image:expression(
- this.runtimeStyle.backgroundImage = 'none',
- this.previousSibling?false:this.className += 'first-child'
- );
none
, соответственно и expression перестает исполняться.
Безопасно вместо background-image
использовать всякие редкие свойства вроде azimuth
.
Изучать дальше
Вообще за поднятую тему оптимизации expression спасибо Павлу Корнилову выступившему с соответствующим докладом на ClientSide 2007.Следует помнить, что одноразовые expression нельзя применять для min-width, min-height и прочего. По понятным причинам подсчеты произведутся только при загрузке страницы.
- Пример трех одноразовых expression а так же пример одного обычного
- Текст доклада Корнилова на ClientSide и жж-пост про это, рекомендую ознакомиться с презентацией(внизу текста на его сайте есть линк)
- PNG fix использующий прием оптимизации, в комментариях есть несколько способов оптимизации
- PNG прозрачность у Харисова с использованием "одноразовости"
21 комментариев к “Одноразовый expression”