24.09.2008

Ссылка цветом текста

Задача: сделать ссылки цветом текста. При этом в разных блоках на странице цвет текста может меняться.

Сначала я указал цвет ссылки отдельно для каждого блока.

body {color: black;}
a.glossary {color: black;}
#shurum, #shurum a.glossary {color: red;}
#burum, #burum a.glossary {color: green;}

Потом я подумал, что ведь цвет ссылки можно наследовать от блока.

body {color: black;}
a.glossary {color: inherit;}
#shurum {color: red;}
#burum {color: green;}

Радости моей не было предела, пока я не открыл страницу в IE. Фак! Оба осла (6 и 7) не поддержали мою гениальную задумку и ни хрена не пронаследовали цвет. Тогда я достал большую базуку и замочил IE вдребезги пополам написал маленький экспрешн.

a.glossary {color: expression(this.parentNode.currentStyle.color);}

Лучше, конечно, написать одноразовый экспрешн (не стал здесь так делать для наглядности).

15.09.2008

IE 6 занял место Netscape 4

Лет 6—7 назад все ненавидели Netscape 4. Чтобы добиться нормального отображения страницы в Netscape 4, верстали исключительно таблицами, делали распорки, а о семантической верстке не шло и речи. Как только его не обзывали — Нетшкаф, Нетглюк, Нафигатор. Но постепенно сайты отказывались от A-grade поддержки Netscape 4. Я помню этот радостный момент, когда Студия объявила о прекращении полноценной поддержки Netscape 4 — все технологи со слезами на глазах обнялись и поздравили друг друга.

Сейчас место «браузера-изгоя тормозящего развитие веба» занял IE 6. Хотя говорить о прекращении A-grade поддержки IE 6 еще рано (думаю, придется еще пару лет с шестым ослом помучиться), тенденция к этому уже наметилась — все чаще встречаются сайты где что-то отвалилось или разъехалось в IE 6.

Ссылка по теме: Graded Browser Support

01.09.2008

JavaScript: область видимости переменных

В JavaScript область видимости переменных не ограничивается блоком {}, а ограничивается только функцией. Например, переменные объявленные внутри for или if продолжают жить после того, как эти for и if отработали.

for (var i = 0; i < 10; i += 1) {
    var a = i * i;
    // do something
}
document.writeln(i);    // 10
document.writeln(a);    // 81

if (true) {
    var b = "test";
    // do something
}
document.writeln(b);    // test


Поэтому, лучше явно обозначить это в коде.

var i, a;
for (i = 0; i < 10; i += 1) {
    a = i * i;
    // do something
}

var b;
if (true) {
    b = "test";
    // do something
}


Во многих языках программирования рекомендуется объявлять переменные как можно ближе к месту первого использования. В JavaScript все используемые в функции локальные переменные лучше объявлять в самом начале функции.

var myFunction = function () {
    // Объявление всех локальных переменных, включая переменные циклов
    // Код функции
}