При использовании "абсолютных" координат точка отсчета помещается в верхний левый угол окна браузера, а оси X и Y направлены вправо по горизонтали и вниз по вертикали, соответственно:
Если в этой системе координат некоторый блочный элемент должен быть размещен на 10px ниже верхнего обреза рабочей области браузера и на 20px правее правого края рабочей области браузера, то его описание будет выглядеть следующим образом:
.example {position:absolute;top:10px;left:20px;}
[Открыть окно примера]
В данной записи тип системы координат задан атрибутом position (значение - absolute), координата X задана атрибутом left (значение - 20px), координата Y задана атрибутом top (значение - 10px).
Атрибуты top и left определяют координаты верхнего левого угла блока в абсолютной системе координат.
Значения координат могут быть и отрицательными. Для того, чтобы убрать из отображаемой области блок с линейными размерами 100px (высота) на 200px(ширина) достаточно отпозиционировать его следующим образом:
.example {position:absolute; top:-100px;left:-200px; width:200px;height:100px;}
[Открыть окно примера]
Абсолютное позиционирование применяется тогда, когда либо все содержание страницы должно быть доступно без скроллинга ("прокрутки"), либо когда элементы разметки находятся в начале страницы и их взаимное размещение важно с точки зрения дизайна, например, для организации всплывающих меню.
Align
Кузина И.А.,Храмцов П.Б. - Применение каскадных таблиц стилей
Конспект
Тесты
Зачет
Зачет
Семинар
Литература
Отзывы
Выравнивание
По умолчанию все слова в параграфе прижаты влево. Левый край параграфа, таким образом, оказывается выравненным. Аналагичным образом может быть выравнен правый край параграфа или блока текста, и даже оба края вместе.
В обычной HTML-разметке этот эфект достигается за счет применения атрибута align, как это сделано на страницах данного пособия :)
...
Аналогичный результат в CSS достигается засчет атрибута text-align:
Этот параграф выравнен по правому краю. Все строки справа кончаются на границе раздела. А вот слева они начинаются с различным отступом от левого края.
Этот параграф выравнен по правому краю. Все строки справа кончаются на границе раздела. А вот слева они начинаются с различным отступом от левого края.
Этот параграф выравнен по правому краю. Все строки справа кончаются на вертикальной границе раздела. Все строки слева теперь начинаются также с вертикальной границы раздела.
Этот параграф выравнен по левому и правому краю. Все строки справа кончаются на вертикальной границе раздела. Все строки слева теперь начинаются также с вертикальной границы раздела.
Выравнивать текст можно в любом блочном элементе. Кроме выравнивая по краям блочного элемента текст можно центрировать (
... ).
далее...
Bgcolor
Цвет фона текста
В HTML цветом фона можно управлять только для конкретного блочного элемента разметки. Таким элементом может быть вся страница:
...
или, например, таблица:
...</table>
Каскадные таблицы стилей позволяют менять цвет фона текста непосредственно по месту, точно так же, как строковые элементы разметки в HTML меняют обычный стиль начертания на italic, например.
В приведенном выше абзаце для выделения текста применено инвертирование цвета фона и цвета текста:
как строковые элементы разметки
При использовании цвета фона следует помнить, что поддержка этого атрибута реализована для всех блочных элементов разметки только с IE 4.0. Поддержка CSS в различных версиях NN гораздо скромнее.
Для работы с фоном элементов существует несколько атрибутов, которые поддерживаются только в IE, начиная с версии 4.0: background-image; background-repeat; background-attachment; background-position. Можно все свойства фона описать в атрибуте background:
background:transparent|color url repeat scroll position Пример:
p {background: gray http://kuku.ru/kuku.gif no-repeat fixed center center;}
Не смотря на такое обилие возможностей, злоупотреблять ими не стоит.
далее...
Bimage
"Пульки"-картинки
Если стандартные формы "пулек" не устраивают автора страницы, то он может использовать нестандартные. Для этого ему придется "пульку" нарисовать самому и в виде графического файла разместить на Web-узле. У такой "пульки" есть URL, который используется в CSS для обращения к ней.
Элемент списка расположен за чертой
if(window.navigator.appName=="Microsoft Internet Explorer") { document.write("
Элемент списка расположен за чертой
"); } else { document.write(" Элемент списка расположен за чертой "); }
Картинка может быть и более замысловатой. Это уже зависит от фантазии автора документа. Например, можно создать картинку-стрелочку:
Элемент списка расположен за стрелкой
if(window.navigator.appName=="Microsoft Internet Explorer") { document.write("
Элемент списка расположен за стрелкой
"); } else { document.write(" Элемент списка расположен за стрелкой "); }
Здесь следует признаться в маленьком обмане. Если вы пользователь IE, то все, что здесь написано - это правда. Фрагмент кода, представленный перед примером, является его точной копией. Перед пользователями же NN придется извиниться. NN не поддерживает этого атрибута. В тексте страницы присутствует JavaScript-код, который имитирует применение атрибута list-style-image в случае просмотра сраницы браузером от Netscape.
далее...
Blockpro
Свойства блоков
Блочные элементы (блоки текста или box) позволяют оперировать с текстом в терминах прямоугольников, которые этот текст занимает. При этом блок текста становится элементом дизайна страницы с теми же свойствами, что и картинка, таблица или прямоугольная область приложения.
Блок текста обладает свойствами: высоты(height), ширины(width), границы(border), отступа(margin), набивки(padding), произвольного размещения(float), управления обтеканием(clear).
Графически свойства можно представить следующим образом:
В данном примере внутри окна браузера расположен блочный элемент(DIV), внутрь которого помещен еще один блочный элемент(P). DIV имеет белый фон и границу. Параграф имеет границу и желтый фон.
С шириной и высотой блока текста более или менее все понятно. Задаваться они могут в типографских пунктах(pt), пикселях(px) и условных единицах(em):
пиксели
типографские пункты
условные единицы
пиксели
типографские пункты
условные единицы
С высотой блока текста следует быть осторожным, т.к. в четвертой версии NN многие из атрибутов CSS не поддерживаются, и высота обычного блочного элемента - один из них.
Расстояние от границы блочного элемента до границы вложенного в него блочного элемента назыается padding. В терминологии данного учебного пособия для обозначения данного свойства употребляется слово "набивка" или словосочетание "внутренний отступ".
Отступ от "набивки" внешнего блочного элемента до границы вложенного элемента называется margin. Для его обозначения мы будем употреблять термин "отступ" или словосочетание "внешний отступ".
Таким образом, padding и margin характеризуют отступы блочного элемента относительного начала его содержания и относительно границы охватывающего его элемента разметки соответственно:
Отступы и "набивка" могут быть левыми, правыми, верхними и нижними. CSS позволяет варьировать любые из них. Более подробно отступы обсуждаются в разделе "Отступы(margin)", а "набивка" в разделе "Набивка(padding)".
При отображении блока текста можно показать его видимую границу. CSS позволяет определить ее стиль, ширину и цвет.При применении видимой границы следует учитывать специфику браузеров. Одним из осмысленных способов применения границы явлется видимое ограничение "плавающих" блоков текста.
"Плавающий" текстовый блок позволяет реализовать возможность обтекания этого блока текстом:
Прижмем блок текста вправо. Слева будем обтекать его другим текстом.
Обтекание одного текста другим происходит в том же самом ключе, что и обтекание текстом картинки или таблицы. Текст охватывающего блока стремится втиснуться в свободное место, оставленное "плавающим" блоком. Когда граница "плавающего" блока кончается, охватывающий блок распространяется на всю ширину отведенного для текста пространства.
CSS позволяет реализовать выравнивание блока текста не только по краю страницы, но и по центру(только в NN).
Отцентрируем блок текста
Блок разместился по центру страницы, если страница просматривается в NN. CSS не поддерживает значение атрибута float равным center.
Таким образом, блок текста с точки зрения размещения на странице равноценен картинкам или прямоугольным областям приложений.
далее...
Border
Граница(border)
У каждого блочного элемента разметки есть граница. От границы отсчитываются отступы (margin и padding). Вдоль границы "плавающего" блока происходит его обтекание текстом.
Для описания границ блоков применяются следующие атрибуты: border-top-width:
ширина верхней границы блока. border-bottom-width:
ширина нижней границы блока. border-left-width:
ширина левой границы блока. border-right-width:
ширина правой границы блока. border-width:
ширина границы блока. Задается в том случае, если ширина границы блока одинаковая по всему периметру блока border-color:
цвет границы блока. Согласно спецификации CSS1 может быть задан для каждой из границ блока. Например, border-right-color:red. Может задаваться как мнемоникой (red, blue, navy и т.п.), так и в нотации RGB (border-color:#003366). Указание цвета для каждой из границ поддерживается не всеми браузерами. border-style:
тип линии границы блока. Может принимать значения: none, dotted, dashed, solid, double, groove, ridge, inset, outset. Согласно спецификации CSS1 может быть задан для каждой из границ блока. Например, border-right-style:dotted. Указание типа линии границы поддерживается не всеми браузерами.
Для описания границы нет необходимости указывать в стиле все атрибуты. Существует сокращенная запись атрибутов. Например, для описания верхней линии границы можно применить запись типа:
p {border-top:1px dotted red;}
атрибут: ширина_линии тип_линии цвет_линии
Если необходимо ограничить блок текста границей, то это может выглядеть примерно так:
В этом примере мы использовали следующее описание стиля отображения границы:
p {text-align:left;border-width:2px; border-color:darkred;border-style:solid;}
if(window.navigator.appName=="Microsoft Internet Explorer") { document.write("
"); } else { document.write(" "); }
Применение границы для обозначения блока не самый элегантный способ оформления документа. Во всяком случае применяют ее нечасто.
Указывая границу в IE, нужно обязательно указывать ее тип, в противном случае она не будет отображаться.
далее...
Bshape
Форма "пулек"
Форма "пульки" в виде "жирной" точки несколько непривычна. Обычно в машинописных документах принято употреблять черту. С другой стороны, в рекламных материалах часто в качестве "пульки" используют квадрат или другой символ типографского набора, а также графическую картинку.
CSS позволяет управлять формой "пульки" через атрибут list-style-type:
В виде пульки используем квадрат
В виде пульки используем квадрат
В виде пульки используем диск
В виде пульки используем диск
В виде пульки используем круг
В виде пульки используем круг
До сих пор мы обсуждали только неупорядоченные списки (UL), но управлять отображением "пулек" можно и в упорядоченных списках (OL):
...
...
"пульки" строчные римские буквы
"пульки" строчные римские буквы
"пульки" строчные римские буквы
"пульки" строчные римские буквы
...
...
"пульки" заглавные буквы
"пульки" заглавные буквы
"пульки" заглавные буквы
"пульки" заглавные буквы
...
...
"пульки" строчные буквы
"пульки" строчные буквы
"пульки" строчные буквы
"пульки" строчные буквы
CSS позволяют вообще отказаться от "пулек". Для этого нужно указать значение атрибута list-style-type равным none.
далее...
Color
Управление цветом в CSS
Каскадные таблицы стилей (CSS) в первую очередь описывают свойсва текста. Это касается как текстовых блоков, так и строковых элементов разметки содержания страницы. В данном разделе речь пойдет об управлении отображением цвета текста (color) и цвета фона (background-color), на котором отображается текст.
Кроме цвета текста и цвета фона CSS позволяет определять цвет границы текстового блока (border-color).
Вообще говоря, атрибуты стилей, которые мы собираемся рассмотреть в этом разделе, относятся к группе атрибутов "Color and Background Properties", как это определено в спецификации Micrоsoft. Всего в эту группу входит семь атрибутов, шесть из которых определяют свойства фона. Кроме цвета фона и его прозрачности можно управлять фоновой картинкой (координатами ее размещения и способами ее повторения). К сожалению NN не поддерживает большинство из этих атрибутов, поэтому мы не сочли возможным их детальное рассмотрение.
Интерпретация атрибутов цвета в NN и IE различаются. В NN фоновый цвет отображается только там, где есть текст, а в IE фоновый цвет заливает весь блок или строковый элемент вне зависимости от присутствия или отсутствия в нем текста.
далее...
в абсолютной системе координат. Его
Этот раздел отпозиционирован в абсолютной системе координат. Его верхний левый край расположен в точке (20px;10px).
Закрыть окно
в абсолютной системе координат.
Этот раздел отпозиционирован в абсолютной системе координат.
[Поднять блок]
[Вернуть блок]
[Закрыть окно]
Family
Гарнитура(font-family)
Гарнитура шрифта - это набор начертаний одного шрифта. Шрифт может иметь "прямое" начертание(noramal), курсив(italic), "скошенное"(oblique), усиленное по насыщенности ("жирное", bold), "мелкое"(капитель, small-caps) и т.п..
Наиболее распространненые гарнитуры в российской части Web - это Times, Arial, Courier. Причем все они принадлежат к разным группам шрифтов. Times - это пропорциональный шрифт "с засечками"(serif), Arial - это пропорциональный шрифт "без засечек"(sans-serif), а Courier - это моноширинный шрифт (monospace). В Unix вместо Arial чаще применяется Helvetica.
В чем разница между этими группами шрифтов лучше всего видно на примере:
Эта строка набрана пропорциональным шрифтом с засечками.
Эта строка набрана пропорциональным шрифтом с засечками.
Эта строка набрана пропорциональным шрифтом без засечек.
Эта строка набрана пропорциональным шрифтом без засечек.
Эта строка набрана моноширинным шрифтом.
Эта строка набрана моноширинным шрифтом.
При указании имени группы шрифтов, как это сделано в примере, браузер подбирает наиболее приемлемый для отображения шрифт данной группы из имеющегося набора шрифтов.
Если оптимизация браузера не устраивает автора страницы, то можно указать непосредственно имя гарнитуры шрифта: "font-family:symbol;padding-left:65px;">N
Если в вашей операционной системе поддерживается шрифт symbol, то вы увидите достаточно прилично записанную формулу суммы, если нет, то - абракадабру. Однако в данном случае применение обычного шрифта вообще бессмысленно - в нем формула не будет правильно отображена.
Рассмотрим теперь менее экзотический пример. Речь пойдет о тексте в поле ввода формы:
В данном случае мы применяем просто шрифт умолчания. Теперь изменим его на другой моноширинный шрифт:
В операционной системе, где тестировались примеры для этой работы, нет киррилицы в гарнитуре Courier, но зато она есть в гарнитуре Courier New. Следовательно, тот пример, в котором применяется гарнитура Courier, будет у нас отображаться абракадаброй. Если Вы, уважаемый читатель, работаете с другим набором шрифтов, результат будет другим.
Данный пример призван был, кроме всего прочего, показать, что при выборе шрифта, а точнее гарнитуры шрифта, не следует мудрить. Лучше всего пользоваться категориями групп шрифтов, тогда текст будет везде отображаться с точки зрения языка правильно. Правда достигаться эта универсальность будет за счет усечения возможностей начертания шрифта.
далее...
Fcolor
Цвет текста
В HTML для управления цветом отображаемого текста используется элемент FONT. Его аналогом в CSS является атрибут color. Этот атрибут можно применять как для блочных, так и для строчных элементов разметки.
Расмотрим в качестве блочного элемента разметки ячейку таблицы:
td {color:darkred;}
Первая колонка
Первая ячейка таблицы
В данном примере цвет текста определен только для обычной ячейки, поэтому содержание заголовка колонки отображается основным цветом(#003366).
При определении цвета текста для блочного элемента весь текст этого блочного элемента отображается заданным цветом. Частичное изменение цвета возможно, если применить строчный элемент разметки внутри блочного:
p {color:darkred;}
i {color:#003366;font-style:normal;}
Первая колонка
Первая ячейка таблицы. В нее вставляем строчный элемент темно-синего цвета.
В данном примере в качестве блочного элемента мы используем параграф, а в качестве строчного элемента(in-line) применяем i. Таблица в данном случае большого значения не имеет, но применяется для единообразия с предыдущим примером. В нее мы помещаем параграф со встроенным в него in-line элементом разметки.
далее...
Float
Обтекание блока текста
Под обтеканием блока текстом понимают тот же самый эффект, который можно реализовать для графики, когда картинка не разрывает блок текста, а встраивается в него. Текст в этом случае "обтекает" картинку с одной из сторон - там где есть свободное поле между границей страницы (элемента) и картинкой. "Обтекание" картинки текстом от обычного встраивания картинки в текст документа отличается тем, что вдоль вертикальной границы картинки располагается несколько строк текста, а не одна.
"Обтеканием" блока текста другим текстом управляют два атрибута CSS: float и clear.
Атрибут float определяет плавающий блок текста. Он может принимать значения: left - блок прижат к левой границе охватывающего блок элемента,
rigth - блок прижат к правой границе охватывающего блок элемента,
both - текст может обтекать блок с обеих сторон.
Проиллюстрировать обтекание можно на следующем примере:
Этот блок текста мы прижали к левой границе раздела. Он имеет границу шириной в один пиксель и ширину в 30% от ширины раздела. Размер шрифта обтекаемого блока текста намеренно уменьшен до 8-ми пикселей, чтобы блок текста лучше выделялся на общем фоне содержания страницы.
При использовании значения "right" блок текста будет прижат вправо.
Этот блок текста мы прижали к правой границе раздела. Он имеет границу шириной в один пиксель и ширину в 30% от ширины раздела. Размер шрифта обтекаемого блока текста намеренно уменьшен до 8-ми пикселей, чтобы блок текста лучше выделялся на общем фоне содержания страницы.
Второй атрибут описания стилей clear позволяет управлять собственно обтеканием. Он запрещает наличие плавающих блоков около блока текста. Атрибут может принимать значения: right, left, none, both:
У этого блока текста не может быть \"плавающего\" правого блока, т.к. мы его запретили. По этой причине он начинается ниже прижатого вправо ограниченного блока.
if(window.navigator.appName=="Microsoft Internet Explorer") { document.write("
Этот блок текста мы прижали к правой границе раздела. Он имеет границу шириной в один пиксель и ширину в 30% от ширины раздела. "); document.write("
У этого блока текста не может быть \"плавающего\" правого блока, т.к. мы его запретили. По этой причине он начинается ниже прижатого вправо ограниченного блока. "); }
Font
Шрифт
Шрифтам в компьютерной графике всегда уделялось много внимания. World Wide Web в этом аспекте не является исключением. Но все богатство и разнообразие шрифтов, существующих в природе, для русского языка ограничено фактически тремя шрифтами: serif(обычно Times или другой шрифт с засечками), sans-serif(Arial, или Helvetica, или другой шрифт без засечек) и monospace(Courier). Если быть точным, то здесь перечислены семейства шрифтов. Обычно, каждое из этих семейств представлено только одним кириллическим шрифтом.
Автор документа для управления отображением букв текста может применить несколько атрибутов, влияющих на шрифт: font-family - семейство начертаний шрифта (гарнитура);
font-size - размер шрифта(кегль). Задается в пикселях(px) и типографских пунктах(pt).
font-variat - вариант начертания (обычный или мелкими буквами - капитель).
Существует также возможность совместить все эти параметры в одном атрибуте font:
font:bold 12pt sans;
Нет, правда, никакой уверенности в том, что последнее определение шрифта будет работать во всех браузерах.
При использовании различных гарнитур (font-famaly) следует помнить, что наличие или отсутствие необходимой автору гарнитуры всецело зависит от предпочтений пользователя. Для кириллицы это может вылиться в появление абракадабры там, где автор применяет отсутствующие у пользователя шрифты.
Самое неприятное, что может возникнуть при использовании шрифтов - это несоответствие моноширинных шрифтов, которые используются в HTML-формах. Обратная связь с пользователем в этом случае оказывается парализованной.
Спецификация CSS разрешает перечислять шрифты в описаниях стилей, что позволяет частично решить проблему подбора шрифта. К сожалению в Unix и Windows шрифты не согласованы. Фактически, при разработке страниц в CSS используются только классы шрифтов (serif, sans-serif и monospace).
далее...
Ident
Первая строка параграфа
При оформлении параграфов в технологии CSS автор может воспользоваться "красной" строкой, которую предоставляет ему атрибут text-indent.
Речь идет о горизонтальном отступе в первой строке параграфа относительно его левого края:
Этот параграф мы начнем со строки с горизонтальным отступом в двадцать типографских пунктов от левого края параграфа.
Этот параграф мы начнем со строки с горизонтальным отступом в двадцать типографских пунктов от левого края параграфа.
А в этом параграфе мы применим отрицательный горизонтальный отступ в первой строке параграфа.
А в этом параграфе мы применим отрицательный горизонтальный отступ в первой строке параграфа.
Отрицательные значения атрибутов - это нормальная практика CSS. Там где логически применение отрицательного значения оправдано, например, смещение вложенного блока текста относительно охватывающего элемента разметки, там можно указывать отрицательные атрибуты смещения.
Кроме text-indent в CSS для управления первой строкой параграфа зарезервирован модификатор стиля first-line. Он позволяет не только задать горизонтальное смещение, но и определить другие параметры параграфа:
P:first-line {color:red}
Другой параметр, который влияет на отображение первой строки параграфа - первая буква первой строки. Ее отображением управляет модификатор first-letter:
P:first-letter {font-size:20pt;}
К большому сожалению оба этих модификатора реализованы не во всех версиях браузеров, поэтому для верности применяют элементы разметки FONT и TABLE.
далее...
Импорт описания стилей
Импорт описателей стилей - это в некотором смысле конкурент описанному выше указанию на внешний описатель стиля.
Импортировать стиль можно либо внутрь элемента STYLE, либо внутрь внешнего файла, который представляет собой описатель стиля. Оператор импорта стиля должен предшествовать всем прочим описателям стилей:
Импортируемый стиль можно переопределить либо через описатель элемента в STYLE, либо через атрибут элемента style.
далее...
Inherit
Наследование и переопределение
При обсуждении технических спецификаций часто бывает полезно вникнуть в смысл названия. В технике принято точно определять в названии суть и назначение стандарта или спецификации. Описание стилей отображения элементов HTML-разметки носит название "Каскадные таблицы стилей". Со словом "стилей" все более или менее понятно. Слово "таблицы" подразумевает набор свойств элемента разметки, который можно представить в виде строки в таблице свойств, т.е. элементы разметки - строки, а свойства - столбцы. А вот слово "каскадные" требует пояснения.
Во-первых, существует иерархия элементов разметки (дерево объектов на странице), во-вторых, свойства этих объектов могут наследоваться. Таким образом, в дереве объектов образуется ветвь, которая ведет к листу дерева - элементу разметки, например, элементу списка или параграфу. Его свойства определяются элементами разметки, в которые вложен элемент и описателями стиля для самого этого элемента:
Это начало первого раздела, который сдвинут на 10 пикселей вправо относительно левого края параграфа и на 10 пикселей вниз относительно стандартной границы параграфа.
Это начало второго раздела, который сдвинут относительно предыдущего раздела на 10 пикселей, а относительно параграфа на 20 пикселей. Данный раздел имеет красную строку с отступом в 10 пикселей и смещен относительно предыдущего раздела на 20 пикселей.
первый элемент списка
второй элемент списка
Список сдвинут относительного второго раздела на 10 пикселей, а относительно текущего параграфа на 30 пикселей. Первая строка не является строкой начала параграфа, поэтому на нее отступ не распространяется (только в Netscape).
Прeдыдущий текст закодирован в терминах разделов и списка следующим образом:
Это начало первого раздела, который сдвинут на 10 пикселей вправо относительно левого края параграфа и на 10 пикселей вниз относительно стандартной границы параграфа.
Это начало второго раздела, который сдвинут относительно предыдущего раздела на 10 пикселей, а относительно параграфа на 20 пикселей. Данный раздел имеет красную строку с отступом в 10 пикселей и смещен относительно предыдущего раздела на 20 пикселей.
первый элемент списка
второй элемент списка
Список сдвинут относительного второго раздела на 10 пикселей, а относительно текущего параграфа на 30 пикселей. Первая строка не является строкой начала параграфа, поэтому на нее отступ не распространяется (только в Netscape).
Таким образом отступы, отсчитываются относительно элемента, в который вложен текущий элемент. Все параметры, которые не были переопределены в текущем элементе, наследуются из старшего по иерархии элемента. Последнее хорошо продемонстрировано в применении стилей отображения списка, который вложен в раздел и поэтому отображается курсивом.
Когда объяснение некоторого феномена HTML-разметки растягивается на несколько параграфов, то полезно воспользоваться графической схемой построения страницы, которая приведена ниже:
При использовании стилей действуют следующие правила старшинства стилей:
Сначала применяются стили умолчания браузера
Стили умолчания браузера переопределяются прилинкованными стилями (элемент LINK заголовка документа).
Прилинкованные стили переопределяются описаниями стилей в элементе STYLE
Стили элемента STYLE переопределяются атрибутом style в любом из элементов разметки
Не все атрибуты стиля могут наследоваться. Например, "набивка" (отступ содержания элемента от его границ) элемента BODY не наследуется вложенными в него элементами и определяется по умолчанию или прописывается отдельно для каждого элемента. Алгоритмы наследования в IE и в NN разные, поэтому для единства отображения элементов следует прописывать стиль по максимуму атрибутов, чтобы добиться единообразия при отображении.
далее...
Intro
Назначение CSS
Дизайн Web-узлов - это точное размещение компонентов HTML-страниц относительно друг друга в рабочей области окна браузера.
Неточность данного определения Web-дизайна очевидна. В нем не учтены ни цвет, ни форма, ни другие свойства компонентов HTML-страниц. Главное в этом определении - показать ограниченность возможностей HTML-разметки. Позиционирование компонентов на странице является одним из самых слабых мест в HTML.
Компонентами страницы являются: блоки текста, графика и встроенные в страницу приложения. Размер и границы каждого из этих компонентов в рамках HTML-разметки задаются с разной степенью точности. Размер графики и приложений можно задать с точностью до пикселя. Размеры текстовых блоков в HTML задать нельзя. Они вычисляются браузером на основе относительного размера шрифта умолчания.
Автор страницы не может заранее определить настроек браузера пользователя, что существенно ограничивает число вариантов представления информации на странице.
Нельзя сказать, что разработчики браузеров не предпринимали попыток изменить данную ситуацию. В ранних версиях браузеров CERN для платформы NEXT и браузерах WWWC автору страницы давалась возможность переопределять настройки умолчания браузера через HTML-разметку. Но этот подход не получил продолжения в коммерческих продуктах и постепенно завял.
Другой способ управления настройками браузера - программирование на JavaScript. Бурное развитие этого языка заставляет говорить о возможности полного контроля над процессом отображения HTML-страниц. Недостаток JavaScript - отказ от декларативного характера разметки и относительно большой объем кода для переопределения свойств элементов разметки.
Спецификация CSS(Cascading Style Sheets) позволяет остаться в рамках декларативного характера разметки страницы и дает полный контроль над формой представления элеметов HTML-разметки.
Каскадные таблицы стилей призваны разрешить противоречие между точностью определения размеров картинок и приложений с одной стороны, и точностью определения размеров блоков текста и его начертания с другой.
Кроме размера компонентов, таблицы стилей позволяют определить цвет и начертание текстового фрагмента, изменять эти параметры внутри текстового блока, выполнять выравнивание текстового блока относительно других блоков и компонентов страницы.
Наличие всех этих возможностей позволяет говорить о CSS как о средстве разделения логической структуры документа и формы его представления. Логическая структура документа определяется элементами HTML-разметки, в то время как форма представления каждого из этих элементов задается CSS-описателем элемента.
CSS позволяет полностью переопределить форму представления элемента разметки по умолчанию. Например, ... Отобразим текст курсивом
Отобразим текст курсивом
А теперь переопределим стиль отображения для элемента разметки i:
Отобразим текст курсивом
Отобразим текст курсивом
Этот пример показывает, что привычный стиль отображения элементов может быть полностью изменен при помощи CSS. В данной технологии HTML-разметка носит чисто декларативный характер.
Практическая значимость CSS для Web-инжиниринга (совокупности технологий разработки и сопровождения Web-узлов) заключена в том, что процесс создания узла можно формализовать и представить в виде следующей последовательности действий:
Сначала нужно определиться с номенклатурой страниц, т.е. все страницы проектируемого Web-узла разбить на типы, например,: домашняя страница, навигационные страницы, информационные страницы, коммуникационные страницы и т.п.. У каждого узла этот перечень может быть своим.
Для каждого из типов страниц разрабатывается определенная логическая структура (стандартный набор компонентов страницы).
После этого разрабатывается навигационная карта узла и форма ее реализации на страницах.
Для каждого стандартного компонета страницы разрабатывается стиль его отображения (CSS-описатель).
Теперь остается только рисовать картинки, создавать анимацию, писать программы, вручную вводить текст и графику или генерировать содержание страниц автоматически во время обращения к ним.
Объяснив таким образом роль и назначение CSS среди многообразия Web-технологий, мы перейдем непосредственно к обсуждению практики применения каскадных таблиц стилей.
далее...
Элемент DIV
DIV выступает в качестве универсального блока. Блочный элемент всегда отделен от прочих элементов страницы (контекста) пустой строкой. DIV не несет никакой смысловой нагрузки. Часто говорят, что DIV - это раздел страницы. Но реально его применение осмысленно только в контексте CSS. Никаких правил умолчания для отображения DIV не существует. Это просто новая строка текста.
DIV позволяет применить атрибуты стиля, связанные с границей блока, отступами блока от границ старшего элемента и "набивку", т.е. отступ от границы блока до границы вложенного элемента:
"Блочный элемент, заданный элементом разметки DIV. Для него определена граница и отступы как от границ старшего элемента разметки, так и для вложенных в него элементов разметки."
Текст в кавычках вложен внутрь элемента DIV следующего вида:
...
Применение элемента DIV не рекомендуется, если текст будет просматриваться браузерами, не поддерживающими CSS. В этом случае лучше применить параграф или другой, подходящий по смыслу, элемент разметки из стандартного набора HTML.
Элемент SPAN
Элемент разметки SPAN - это обобщенный строковый элемент разметки, применение которого не приводит к образованию блока текста. Он может заменить собой элементы: FONT, I, B, U, SUB, SUP и т.п. Приведем примеры таких соответствий:
HTML-элемент
CSS-аналог
...
...
...
...
...
...
...
...
и т.п.
В новых версиях браузера Netscape пересекать описания строковых стилей нельзя. Таг конца элемента строкового типа закрывает ближайший элемент, а не тот, который открыт тагом начала данного строкового стиля. Такое поведение в точности совпадает с применением элемента SPAN, т.к. в последнем таг конца можно соотнести только с ближайшим тагом начала элемента span:
предложение с пересекающимися стилями
предложение с пересекающимися стилями
предложение с пересекающимися стилями
предложение с пересекающимися стилями
Применение элемента SPAN ограничено браузерами, которые поддерживают CSS. При этом не все атрибуты спецификации CSS поддерживаются в разных браузерах. Например, атрибут vertical-align, который призван заменить элементы SUP и SUB, не поддерживается ни одним из браузеров.
далее...
Элемент STYLE
Применение элемента STYLE - это основной способ внедрения каскадных таблиц стилей в ткань HTML-документа. Кроме управления отображением элементов разметки элемент STYLE позволяет описывать стилевые свойства элементов, которые можно изменять при программировании на JavaScript.
Элемент STYLE позволяет определить стиль отображения для:
стандартных элементов HTML-разметки
произвольных классов (селектор class)
HTML-объектов (селектор id)
К сожалению, работа с селекторами в браузерах различных производителей может преподнести различного рода сюрпризы. Особенно это касается работы с селектором ID. Будем считать правильной интерпретацию Microsoft как держателя патента на спецификацию CSS.
Понятие селектора, применение селекторов и формальный синтаксис CSS мы обсудим в разделах "Синтаксис" и "Наследование и переопределение".
Стандартные элементы разметки описываются в элементе STYLE следующим способом:
...
Этот параграф мы используем в качестве примера применения описания стиля для стандартного элемента HTML-разметки.
...
Теперь все параграфы документа будут отображаться стилем из элемента STYLE, если только стиль не будет переопределен каким-либо способом. В STYLE можно определить стиль любого элемента разметки.
[ начало страницы ]
Каскадныетаблицыстилей
Lheight
Межстрочное расстояние
В CSS межстрочное расстояние определяется параметром line-height. Он задает расстояние не между строками, а между базовыми линиями строк. Проще говоря, если, например, взять букву "X" и напечатать ее последовательно друг под другом, то line-height будет равно расстоянию между двумя одинаковыми точками букв. Например, между точками пересечения палочек "Х":
Посмотрим, как этот параметр влияет на взаимное расположение строк:
Этот параграф мы набрали кеглем 12 pt. Line-height задано в 12 pt.
Этот параграф мы набрали кеглем 12 pt. Line-height задано в 12 pt.
Этот параграф мы набрали кеглем 12 pt. Line-height задано в 24 pt.
Этот параграф мы набрали кеглем 12 pt. Line-height задано в 24 pt.
Этот параграф мы набрали кеглем 12 pt. Line-height задано в 6 pt.
Этот параграф мы набрали кеглем 12 pt. Line-height задано в 6 pt.
Первый пример набран со значением line-height равным размеру кегля. Во втором примере значение line-height вдвое превышает размер кегля. В третьем примере значение line-height в два раза меньше размера кегля - строки стали "налезать" друг на друга.
В связи с использованием line-height следует обратить внимание на применение in-line картинок на HTML-страницах. Под in-line картинкой здесь мы понимаем картинку, которая встроена в тело документа при помощи элемента IMG, но не с новой строки и не как элемент таблицы:
"color:white;background-color:darkred;font-size:20px;"> В эту строку мы встраиваем картинку - , которая изображает концентрические круги.
В эту строку мы встраиваем картинку - , которая изображает концентрические круги.
Картинка имеет размеры 24х24 пикселя и выравнена по верхнему краю строки. Ее размер больше размера кегля (20px), поэтому межстрочное расстояние увеличено браузером автоматически.
"color:white;background-color:darkred;font-size:24px;"> В эту строку, которая имеет размер кегля 24рх, мы встраиваем картинку - , изображающую концентрические круги.
В эту строку, которая имеет размер кегля 24рх, мы встраиваем картинку - , изображающую концентрические круги.
Таким образом, можно точно позиционировать текст и графику в строке. В качестве примера можно использовать оглавление этого учебника.
далее...
Линейные размеры блока
Линейные размеры блока задаются двумя параметрами: шириной(width) и высотой(height) блока. В браузерах ширина и высота блока интерпретируется по разному.
В NN ширина и высота блока - это рекомендуемые параметры. Если текст выходит за эти ограничения, то блок увеличивается до необходимых размеров, если текста нет вообще, то блок сжимается до маленького квадрата:
...
Текст размещен для того, чтобы блок был виден в Netscape Navigator
Приведенного в примере описания должно хватить для получения результата, но в NN для такого блока нужно применить некоторые дополнительные атрибуты:
...
Без границы блок не будет залит темно-красным цветом, а без span текст будет отображаться цветом умолчания для данной страницы. Никакому разумному объяснению такое поведение браузера не поддается, поэтому не стоит на этих атрибутах строить дизайн страниц.
далее...
Lists
Списки
При отображении списков CSS позволяет управлять формой и изображением "пулек"(bullets) списка. "Пулька"(bullet) - это символ перед элементом списка. Например, в неупорядоченном списке (unordered list) перед элементом списка ставится "жирная" точка:
Первый элемент списка
Второй элемент списка
Третий элемент списка
CSS позволяют управлять формой "пулек" и заменять "пульки" картинками.
Любопытно, что управление отображением элементов списка отнесено к набору свойств, в который входит атрибут display. У этого атрибута может быть только одно значение - none. Если элемент в своем описании имеет атрибут display, и этот атрибут равен none, то он браузером не отображается вообще:
Первый элемент списка
Второй элемент списка
Третий элемент списка
Первый элемент списка
Второй элемент списка
Третий элемент списка
Если Вы, Уважаемый Читатель, посмотрите HTML-код данного документа, то вслед за примером найдете описание списка, которое браузер не отобразил.
Атрибут display управляет отображением документа на дисплее компьютера, но не распространяется на другие среды отображения документа. Например, при печати скрытый список должен быть отображен.
Однако, в реальности он не отображается и при печати.
далее...
Lit
Кузина И.А.,Храмцов П.Б. - Применение каскадных таблиц стилей
Конспект
Тесты
Зачет
Зачет
Семинар
Литература
Отзывы
Литература(Ссылки)
На данной странице представлен список литературы и полезных гипертекстовых ссылок по разработке страниц с применением каскадных таблиц стилей:
Cascading Style Sheets, level 1 (CSS1). W3C Recommendation 17 Dec 1996, revised 11 Jan 1999(Рекомендация WWWC для СSS1. Фактически, -это стандарт)
Hakon Wium Lie и Bert Bos. Каскадные таблицы стилей, уровень 1. Перевод Всероссийского Клуба Вебмастеров(Перевод спецификации CSS1)
The CSS1 Test Suite(Страница W3C для проверки браузеров на предмет поддержки ими спецификации CSS1)
Erik Wilde: Wilde's WWW, technical foundations of the World Wide Web. (Springer 1998,ISBN:3-540-64285-4) [CSS1](Книга, охватывающая все информационные технологии World Wide Web)
Ian Graham: The HTML Stylesheet Sourcebook(Текста книги нет, но есть работающие примеры применения CSS)
Hеkon Wium Lie, Bert Bos: Cascading Style Sheets: Designing for the Web (2nd edition, Addison-Wesley 1999, ISBN:0-201-59625-3) [CSS2] (Примеры отдельных глав из книги)
Handan Selamoglu. A User's Guide to Style Sheets. Microsoft Corporation, Updated: October 24, 1996.(Очень полезное, прекрасно структурированное и краткое руководство. К нему прилагается справочник по атрибутам CSS)
Tapio Markulalle. CSS teaching pages(Очень подробный учебник по CSS, написанный изначально на финском языке и переведенный автором на английский язык)
Urban Fredriksson. Short Guide to CSS.(Одна страничка с коротким описанием принципов использования CSS)
Style Sheets. (http://webreview.com/pub/Style_Sheets)(Подборка статей по использованию CSS)
Каскадные таблицы стилей II. Спецификация CSS2. Рекомендации W3C от 12 мая 1998 года(Частичный перевод спецификации CSS2. Переводчики обещают, что смогут в конце концов его закончить)
Lspace
Межбуквенные расстояния
Расстояние между буквами автоматически регулируется размером шрифта - кеглем. Чем больше размер шрифта, тем больше расстояние между буквами:
Этот параграф набран увеличенным кеглем
А шрифт этого параграфа еще больше
Достаточно внимательно присмотреться, чтобы убедиться в том, что расстояния между буквами в слове "параграф" первого примера и буквами слова "параграфа" второго примера разные. Во втором случае они больше:
Моноширинный шрифт выбран не случайно. На пропорциональном шрифте межбуквенное расстояние зависит от начертания букв и показать его как расстояние между буквами достаточно сложно. У моношириннго шрифта "очко" символа фиксировано, поэтому и расстояние между буквами хорошо прослеживается.
Однако не всегда удобно управлять межбуквенным растоянием через кегль (font-size). Бывают случаи, когда строку нужно либо уплотнить, либо разрядить. Достигается это за счет атрибута letter-spacing:
"font-family:monospace; letter-spacing:10pt; color:darkred"> Межбуквенное расстояние 10pt
Межбуквенное расстояние 10pt
"font-family:monospace; letter-spacing:20pt; color:darkred"> Межбуквенное расстояние 20pt
Межбуквенное расстояние 20pt
В версиях NN 4.x этот параметр не поддерживается. Остается уповать только на font-size.
далее...
Margin
Отступы(margin)
При отображении блока текста на листе бумаги вокруг него обычно оставляют поля. Поля есть и в ученических тетрадях, и в больших серьезных книгах. Поля можно задавать либо относительно границы страницы, либо относительно самого блока текста. В первом случае мы имеем дело с "набивкой" (padding), а во втором - с отступом (margin). Собственно, ширина поля будет определяться суммой ширины "набивки" и ширины отступа:
Обычно пунктирная линия и граница блока являются невидимыми линиями. Они угадываются по выравненному краю текста. Вернее угадывается суммарная ширина полей. Стрелки указывают направление отсчета отступа. Padding отсчитывается от внешней границы блока внутрь блока, в то время как margin от внешней границы блока в область охватывающего его блока (наружу).
Внешний отступ(margin) может отсчитываться по любому направлению относительно сторон блока: margin-left:
левый внешний отступ. Определяет расстояние от левой границы блока текста до левой границы внутреннего отступа("набивки", padding) охватывающего элемента margin-right:
правый внешний отступ. Определяет расстояние от правой границы блока текста до левой границы внутреннего отступа("набивки", padding) охватывающего элемента margin-top:
верхний внешний отступ. Определяет расстояние от верхней границы блока текста до верхней границы внутреннего отступа("набивки", padding) охватывающего элемента margin-bottom:
нижний внешний отступ. Определяет расстояние от нижний границы блока текста до нижней границы внутреннего отступа("набивки", padding) охватывающего элемента margin:
задает общий внешний отступ от всех сторон блока текста. Применяется в случае равноудаленности блока текста от всех границ внутреннего отступа охватывающего элемента.
Графически эти отступы можно представить следующим образом:
В данном случае для параграфа использовалось следующее описание стиля:
p {margin-left:50px;margin-right:5px; margin-top:15px;margin-bottom:50px; padding:0px;text-align:left;}
Следует отметить, что браузеры могут по разному отображать эти параметры. NN 4.x довольно неуклюже обрабатывает margin, оптимизируя представление стиля там, где этого делать не нужно.
Если размер всех внешних отступов одинаковый, то можно просто воспользоваться атрибутом margin:
p {margin:5px;}
При применении внешнего отступа следует помнить, что он отсчитывается от границы элемента до границы внутреннего отступа ("набивки", padding) охватывающего элемента. Если не учитывать этого факта, то общая ширина видимых полей может оказаться больше, чем указано во внешнем отступе.
далее...
Область видимости блока. clip.
Соверешенно необязательно показывать весь блок целиком. Можно показать только часть блока. Управляется такое отображение параметром clip описания CSS. В приведенном ниже примере мы просто обрезали карточку голубого цвета.
</div>
[Проявить верх карточки] [Проявить левый край карточки]
[Проявить низ карточки] [Проявить левый край карточки]
[Все вернуть в первоначальное положение.]
Достигнутый эффект очень похож на изменение "нарезанной" графики, но только достигнут он другими средствами.
При вырезании области видимости в IE следует учитывать, что работает clip только при абсолютном позиционировании. В NN поддерживается как абсолютное позиционирование, так и относительное.
далее...
Относительные координаты
Данная координатная система позволяет разместить блоки на странице в координатах охватывающего их блока. Преимущества и необходимость наличия такой координатной системы очевидны. Она позволяет сохранять взаимное расположение элементов разметки при любом размере окна браузера и его настройках умолчания.
В качестве точки отсчета в этой системе координат выбрана точка размещения текущего блока по умолчанию. Ось X при этом направлена горизонтально вправо, а ось Y - вертикально вниз.
Для задания координат блока в этой системе применяют запись типа:
Этот блок находится в точке отсчета относительных координат
А этот блок смещен вправо на 50px
Этот блок находится в точке отсчета относительных координат
А этот блок смещен вправо на 50px
Для работы с относительной системой координат лучше пользоваться универсальными блоками DIV. Это связано с тем, что в NN, например, параграф не может содержать параграфов. Любой блок немедленно закрывает параграф, следовательно, вложить в него что-либо нельзя.
Следует отметить, что NN вообще непредсказуем в работе с относительными координатами, поэтому в нем их следует избегать.
В относительной системе координат можно пользоваться отрицательными смещениями:
Сдвинуть слой
В данном примере слой, первоначально сдвинутый на 50 пикселей вправо, после нажатия на гипертекстовую ссылку смещается на 100 пикселей влево, получая отрицательную величину смещения по оси X (left:-50px). После повторного нажатия на ссылку положение блока восстанавливается.
Padding
Набивка(padding)
Текст внутри блока начинается не от самой границы блока. Между границей и содержанием блока есть свободное пространство. Оно носит название внутреннего отступа текстового блока или padding. Совместно с внешним отступом(margin) текстового блока padding образует общее поле отступа от границы охватывающего блок элемента разметки.
Графически padding можно проиллюстрировать на примере левого внутреннего отступа текста в параграфе:
Для этого примера при описании параграфа использовался стиль:
p {padding-left:100px; text-align:left;border-width:1px;}
Для того, чтобы браузер правильно отображал стили, не следует размещать описание стиля на нескольких строчках, как это сделано в примере. Для IE это не имеет значения, а NN может "споткнуться".
У блока текста существует четыре стороны. Соответственно padding может быть: padding-left:
левый внутренний отступ, который определяет расстояние от левого края блока до его содержания. padding-right:
правый внутренний отступ, который определяет расстояние от правого края блока до его содержания. padding-top:
верхний внутренний отступ, который определяет расстояние от верхнего края блока до его содержания. padding-bottom:
нижний внутренний отступ, который определяет расстояние от нижнего края блока до его содержания. padding:
определяет единый размер внутреннего отступа блока. Этот параметр задается в случае одинакового размера поля отступа от всех сторон блока.
Проиллюстрируем применение padding примером:
p {padding-left:100px;padding-right:50px; padding-top:20px;padding-bottom:10px;text-align:left; border-width:1px;}
При установке padding следует всегда помнить, что этот параметр задает размер отступа от границы блока до границы внешнего отступа(margin) содержания блока. По этой причине общий размер поля может оказаться больше, чем задано в параметре padding.
далее...
Переопределение стиля
Под переопределением стиля в элементе разметки мы понимаем применение атрибута STYLE у данного элемента разметки:
Заголовок первого уровня
Порядок наложения блоков. z-index.
Если быть более точным, то блоки - это прямоугольные карточки, которые лежат на поверхности, перекрывая друг друга. Расстояние между ними задать нельзя, т.е. полноценного третьего измерения нет:
Порядок перекрытия блоков (слоев в терминах Netscape) определяется атрибутом z-index. Чем больше значение z-index, тем ближе к наблюдателю находится слой:
Как видно из картинки, z-index может принимать и отрицательные значения.
При работе с этим атрибутом следует иметь в виду, что NN и IE применяют разные модели описания "слойки". В IE - это просто числовой параметр, который закреплен за блоком и не влияет на значения этого параметра у других блоков. В NN изменение параметра z-index одного блока влиет на значения этого параметра у других блоков. Они, словно карточки на столе, перекладываются и принимают новую нумерацию.
[Переложить]
Карточки перекрываются. Если нажать на гипертекстовую ссылку "Переложить", то голубая карточка поползет вниз и при обратном ходе поменяет свое местоположение относительно красной карточки.
Pos
Позиционирование
Этот раздел посвящен размещению блочных элементов HTML-разметки в рабочей области браузера с точностью до пикселя. До появления спецификации CSS-P, которая вошла в спецификацию CSS2, ничего подобного делать на HTML-страницах было нельзя. Некоторые наиболее дотошные читатели могут спросить - "А как на счет элемента разметки LAYER?". Во-первых, LAYER был введен Netscape практически одновременно с появлением CSS-P, а во-вторых, он поддерживается только браузерами Netscape.
Позиционирование и его программирование на JavaScript - это сплошное "минное поле" между двумя основными браузерами. При просмотре этих страниц следует отдавать себе отчет в том, что для каждого браузера загружается своя страница описания свойств позиционирования.
До появления CSS-P единственным средством относительно точного позиционирования были таблицы. Они позволяли точно расположить компоненты HTML-страницы относительно друг друга на плоскости. CSS-P описание позволяет точно разместить элемент разметки не только относительно других компонентов страницы, но и относительно границ страницы.
Кроме этого CSS-P добавляет странице еще одно измерение - элементы разметки могут "наезжать" друг на друга.
Первый слой, на который наедем другим слоем. Второй слой, который наезжает на первый.
[Переложить слои]
При этом можно менять порядок "наезда" - "перекладывать" слои. Для того, чтобы в этом убедиться, достаточно воспользоваться ссылкой из выше приведенного примера.
Но и это еще не все. Слои можно проявлять:
В целях конспирации этот текст могут увидеть только грамотные люди, которые умеют читать (какой-то бред как по форме, так и по содержанию :) ).
[Прояви текст]
[Скрой текст]
Термин "слой" вместо "блочный элемент разметки" используется здесь по той причине, что он лучше отражает эффект, который достигается за счет позиционировани, а не в пику поклонникам Microsoft.
Теперь осталось перейти к обсуждению атрибутов позиционирования.
далее...
Селектор - идентификатор объекта.
Объектная модель документа (Document Object Model) описывает документ как дерево объектов. Объектами являются: сам документ, разделы(элемент DIV), картинки, параграфы, приложения и т.п.. Каждый из объектов можно поименовать и обращаться к нему по имени. Данная возможность используется при программировании страниц на стороне клиента, например, на JavaScript.
Применение идентификатора объекта оправдано еще и в случае модификации атрибута описания стиля для данного объекта в его CSS-описании. Вместо создания двух описаний классов, которые различаются только одним из параметров, можно создать одно описание и описание идентификатора объекта. Описание стиля для объекта задается строкой, в которой селектор представляет собой имя этого объекта с лидирующим символом "#":
модифицированная гипертекстовая ссылка
Следует оговориться, что интерпретации идентификаторов объектов в IE и NN разные. Дело в том, что существует еще атрибут name у элемента разметки. NN предпочитает иметь дело именно с этим атрибутом при идентификации объекта, а IE с атрибутом id.
Различия в интерпретации ID в браузерах при декларативном использовании CSS не очень страшны. Все становится гораздо хуже, когда автор решится программировать стили, т.е. изменять значения атрибутов описателей стилей. В этом случае разница объектных моделей документов в NN и IE проявится в полной мере. Фактически, придется разрабатывать совершенно разные страницы для каждого из браузеров.
далее...
Селектор - имя элемента разметки
Когда автор Web-узла хочет определить общий стиль всех страниц, то он просто прописывает стили для всех элементов HTML-разметки, которые будут на страницах использоваться. Это дает возможность скомпоновать страницы из логических элементов, а стиль отображения этих элементов описать во внешнем файле.
Такой способ конструирования сайта позволяет автору изменять внешний вид всех страниц путем внесения изменений в файл описания стилей, а не в файлы HTML-страниц.
Внешний файл при этом может выглядеть следующим образом:
i, em {color:#003366,font-style:normal}
a i {font-style:normal;font-weight:bold;text-decoration:line-through}
Первая строка этого описания перечисляет селекторы-элементы, которые будут отображаться одинаково:
>Это курсив и это тоже курсив
Это курсив и это тоже курсив
Последняя строка определяет стиль отображения вложенного в гипертекстовую ссылку курсива:
kuku
В данном случае переопределение состоит в том, что текст отображается внутри гипертестовой ссылки перечеркнутым и "жирно".
[начало страницы ]
Селектор - имя класса
Имя класса не является каким-либо стандартным именем элемента HTML-разметки. Имя класса определяет описание класса элементов разметки, которые будут отображаться одинаково. Для того, чтобы отнести элемент разметки к определенному классу, нужно воспользоваться атрибутом class этого элемента разметки:
...
Этот параграф мы отобразим белым цветом по темно-красному фону
Этот параграф мы отобразим белым цветом по темно-красному фону
Эту гипертекстовую ссылку мы отобразим белым цветом по темно-красному фону.
Как видно из этого примера, в любом элементе разметки можно сослаться на описание класса отображения. При этом совершенно не обязательно, чтобы элементы разметки были однотипными. В примере к одному классу отнесены и параграф и гипертекстовая ссылка в другом параграфе.
Лидирующую точку в имени класса можно опускать. Она задается из соображений сохранения общности описания. Так, например, можно определить классы отображения однотипных элементов разметки:
a.paragraph {color:navy;text-decoration:underline;}
В данном примере класс гипертекстовых ссылок menu имеет одно описание стиля, а класс гипертекстовых ссылок paragraph совершенно другое. При этом каждый из этих классов нельзя применить к другим элементам разметки, например, параграфу или списку. Если не задано имени элемента разметки, то это обозначает, что класс можно отнести к любому элементу разметки - корневой класс описания стилей. Это очень похоже на обозначение имени корневого домена в системе доменных имен. Собственно ничего удивительного здесь нет, т.к. система классов объектов на HTML-странице представляет из себя дерево. Элементы разметки - это узлы дерева.
[ начало страницы ]
Size
Кегль(font-size)
Кегль - это, если говорить упрощенно, размер шрифта. Более подробное объяснение следует искать в специальной типографской литературе. Нам здесь будет достаточно того, что CSS через параметр font-size позволяет управлять размером букв.
Размер шрифта можно задавать в типографских пунктах(pt, 0,35мм) или пикселях(px). При установки кегля стоит помнить, что font-size задает не высоту буквы, а размер "очка" под букву, который больше самой буквы.
Вот несколько примеров использования font-size:
Кегль параграфа установлен в 12 пунктов
Кегль параграфа установлен в 12 пунктов
Кегль параграфа установлен в 12 пикселей
Кегль параграфа установлен в 12 пикселей
Кегль параграфа установлен в 120% от размера букв охватывающего параграф элемента
Кегль параграфа установлен в 120% от размера букв охватывающего параграф элемента
Как видно из последнего примера, кегль можно задавать не только в абсолютных единицах, но и в относительных. Кроме процентов существует еще несколько условных единиц измерения кегля, которые можно применять в CSS:
Размер кегля large
Размер кегля large
Размер кегля small
Размер кегля small
Размер кегля x-small
Размер x-small large
Размер кегля xx-small
Размер кегля xx-small
Аналогично x-small и xx-small существуют размеры x-large и xx-large. Кроме этого есть larger, smaller, medium.
далее...
Ссылка на внешнее описание
Ссылка на описание стиля, расположенное за пределами документа, осуществляется при помощи элемента LINK, который размещают в элементе HEAD. Внешнее описание может представлять из себя файл, содержание которого - описание стилей. Описание стилей в этом файле будет по синтаксису в точности совпадать с содержанием элемента STYLE.
Ниже приведен пример ссылки на внешнее описание стилей:
Важными здесь являются значения атрибутов rel и type. Rel обязан иметь значение "stylesheet". Type может принимать значения: "text/css" или "text/javascript". Второй тип описания стилей введен Netscape. Его мы в данном учебном курсе не обсуждаем.
Атрибут href задает универсальный локатор ресурса (URL) для внешнего файла описания стилей. Это может быть ссылка на файл с любым именем, а не только на файл с расширением *.css.
[начало страницы ]
Style
Начертание
У каждой гарнитуры (font-family) есть несколько начертаний. Каждое из них определяется в CSS тремя параметрами стиля: font-style, font-variant, font-weight.
Атрибут стиля font-style определяет прямое начертание (normal) и курсив:
Прямое начертание
Прямое начертание
Курсив
Курсив
Если хочется усилить насыщенность ("жирность") текста, то в этом случае в описании стиля указывают атрибут font-weight, который принимает значения normal или bold:
Курсив
Вообще говоря, хотя шрифт и масштабируется при помощи задания кегля, но качество его начертания обычно при этом страдает. Для качественного отображения мелких букв в некоторых гарнитурах присутствует начертание капитель. В CSS для использования капители зарезервирован атрибут font-variant, который принимает значения normal и small-caps. Реальное применение font-variant проблематично из-за отсутствия капители в стандартном наборе кириллических шрифтов.
далее...
Text
Текст
В этом разделе мы рассмотрим те свойства текстового фрагмента, которые остались без внимания при рассмотрении блоков текста и шрифтов.
При обсуждении свойств блочных элементов разметки был сделан упор на описание параметров, относящихся к блоку как целому. Мы не рассматривали внутренние характеристики текста.
Обсуждая шрифты, мы сосредоточили свое внимание на начертаниях символов как таковых, а не на их соотношениях между собой.
При всем при этом в стороне остались такие важные характеристики текстового фрагмента, как:
межбуквенные расстояния,
высота строк,
выравнивание,
отступ в первой строке параграфа,
преобразования начертания,
Все эти атрибуты сгруппированы в свойства текстовых фрагментов (Text Properties).
далее...
Trans
Преобразование шрифта
Преобразование шрифта подразумевает капитализацию слов, первод всех "больших" и "маленьких" букв в большие, или, наоборот, получение одних строчных.
Рассмотрим несколько примеров:
Transfer All Letters into Uppercase
Transfer All Letters into Uppercase
Transfer All Letters into Lowercase
Transfer All Letters into Lowercase
Capitalization of the string
Capitalization of the string
Английский язык для фраз этих примеров выбран не случайно. Выполнение преобразований зависит от алгоритма преобразования символов. В нелокализованных программах переход от строчных букв к прописным осуществляется путем простого смещения по таблице ASCII, что для русского алфавита не является приемлемым
Еще один вид преобразования шрифта - это подчеркивание, перечеркивание или надчеркивание слов. Выполняется такое преобразование путем применения атрибута text-decoration:
Перечеркнем это предложение.
Перечеркнем это предложение.
Подчеркнем это предложение.
Подчеркнем это предложение.
Для того, чтобы преобразование работало, нужно соответствующее начертание (подчеркнутые или перечеркнутые начертания букв). Очень сложно найти гарнитуру, в которой было бы начертание с надчеркнутыми буквами. Отмена декора происходит, если использовать в text-decoration значение none.
далее...
Управление видимостью
Одним из наиболее интересных атрибутов CSS-P является атрибут visibility. Он позволяет "проявлять" или прятать информацию на HTML-странице.
Например, эта страница - набор кадров, которые можно перелистывать. Для этого просто нужно нажимать на слово "далее" в конце этой страницы.
Перелистывание реализовано как изменение атрибута visibility в JavaScript-функции:
На предыдущих фрагментах этой страницы мы обсудили программирование visibility, но ни словом не упомянули о том, как этот атрибут записывается в CSS. Здесь мы восполняем этот пробел и приводим описание невидимого раздела:
...
При программировании атрибута visibility следует принимать в расчет тип браузера. Данная страница написана для Netscape Navigator. Только этот браузер поддерживает объект layer, который мы используем при программировании. В Microsoft Internet Explorer этот код работать не будет. Для IE нами разработана другая страница.
далее...
Управление видимостью
Одним из наиболее интересных атрибутов CSS-P является атрибут visibility. Он позволяет "проявлять" или прятать информацию на HTML-странице.
Например, эта страница - набор кадров, которые можно перелистывать. Для этого просто нужно нажимать на слово "далее" в конце этой страницы.
Перелистывание реализовано как изменение атрибута visibility в JavaScript-функции:
На предыдущих фрагментах этой страницы мы обсудили программирование visibility, но ни словом не упомянули о том, как этот атрибут записывается в CSS. Здесь мы восполняем этот пробел и приводим описание невидимого раздела:
...
При программировании атрибута visibility следует принимать в расчет тип браузера. Данная страница написана для Microsoft Internet Explorer. Это следует и из программного кода, который поддерживает DHTML объектную модель документа и из использования атрибута id у раздела. Для Netscape Navigator нами разработана другая страница.
далее...
Атрибут style можно применить внутри любого элемента разметки. Например, мы можем через style определить ширину и выравнивание элемента hr(горизонтальное отчеркивание):
Очевидно, что не всякие параметры стиля можно установить для конкретного элемента разметки. О типах элементов и соответсвующих парамерах стилей мы поговорим в разделе "Понятие блочного и строкового элемента".
Здесь же следует отметить следующее: стили разработаны в первую очередь для управления отображением текста. Не следует увлекаться стилями при управлении отображением нетекстовых элементов HTML-разметки.
[начало страницы ]
Web-инжиниринг
Base_fw
Базовый адрес. Окна и фреймы.
При встраивании в HTML-документ контекстной гипертекстовой ссылки(элемент A) можно кроме URL следующей Web-страницы указать и окно-мишень, в которое эту страницу следует загружать. Реализована эта возможность в атрибуте target элемента A(anchor). Такой же атрибут есть и у элемента BASE. В ряде случаев все ссылки страницы отображаются в другое окно(случай меню). В этом случае достаточно определить атрибут target в BASE и все URL для ссылок можно указывать в неполной(относительной форме).
Например, если мы имеем постоянноотображаемое меню, а все ссылки из него загружают страницы в окно new, то такой документ может выглядеть следующим образом:
В данном случае при выборе любой из гипертекстовых ссылок документа страница, которая в ней указана будет загружаться в окно new. Если такого окна нет, то браузер его откроет. При таком подходе следует помнить, что если окно открыто, то браузер открывать нового окна не будет, а загрузит документ в уже открытое окно. При этом если это окно не в "фокусе", т.е. не является окном, с которым работает пользователь, и скрыто под другими окнами, то загрузка в него документа не приведет к установке фокуса на данное окно, т.е. окно не появится на экране поверх других окон. Для того, чтобы передать фокус необходимо помимо указания окна-мишени в атрибуте target еще и передавать фокус. Сделать это можно при помощи JavaScript-кода.
Все становится на много проще, если в качестве окна-мишени используется фрейм. В этом случае не надо никуда передавать фокус. Если быть абсолютно точным, то фокус передавать все равно надо, только проявляется это не при перезагрузке окна, а, например при печати. В этом случае фокус можно передать, кликнув мышкой в соответствующий фрейм.
На самом деле упрощение при работе с фреймами вызвано ,во-первых, тем, что рабочая область окна браузуера разбивается на фреймы до загрузки документа с меню, т.е. окна при выборе гипертекстовой ссылки уже существуют и , во-вторых, тем, что окно браузера является активным окном (окном в "фокусе") в момент выбора гипертекстовой ссылки.
далее...
Base
Элемент разметки BASE
Элемент разметки BASE служит для определения базового URL для гипертекстовых ссылок документа, заданных в неполной(частичной) форме. Кроме этого BASE позволяет определить мишень(окно) загрузки документа по умолчанию при выборе гипертекстовой ссылки текущего документа.
Общепринятым стилем разметки гипертекстовых ссылок является разметка в частичнозаданных(относительных) адресах, когда URL задается относительно текущего местоположения документа. ...
В этом случае в качестве базы по умолчанию выбирается каталог в котором размещен HTML-документ (./). Такой стиль разметки удобен тем, что при переносе всего дерева документов в другое место не потребуется менять систему гипертекстовых ссылок внутри документов. Кроме того, распространению этого стиля способствует и сама архитектура World Wide Web. Наиболее тесные связи между документами прописываются только в рамках одного Web-узла. Связей данного узла с остальными существенно меньше, и их можно прописать непосредственно в ссылках в полной форме.
Контейнер BASE можно использовать вне документа, в заголовке, или теле документа. При этом область действия базового адреса определяется от места размещения контейнера до следующего контейнера BASE.
...
...
Наиболее часто BASE встречается на страницах узлов, которые имеют "зеркала". Часть документов основного сервера не переносится на "зеркальный" сервер по различным причинам. В этом случае документ с принудительно заданным базовым URL всегда будет ссылаться на основной сервер. Он является своеобразной "белой вороной" среди прочих документов Web-узла. При этом такая схема часто используется в совокупности с запретом на кэширование данного документа как клиентом (браузером), так и proxy-серверами.
Существуют различия и при определении базового URL умолчания при обращении к страницам, которые различны по своей природе. Если для обычного файла базовым адресом умолчания является адрес коталога, в котором хранится данный файл, то для страниц, которые генерируются "на лету" возможны и другие базовые адреса умолчания. Например, для страниц сгенерированных CGI-скриптом адресом умолчания является URL данного скрипта. Если из такой страницы снова вызвать скрипт, как частичнозаданную ссылку, то имя скрипта будет передано в качестве параметра скрипту, который сгенерировал данную страницу.
При загрузке представленного выше документа в браузер легко убедиться, что заданные в неполной форме ссылки будут указывать на разные Web-узлы. Для этого достаточно обратить внимание на значения, отображаемые в поле статуса браузера, или распечатать массив гипертекстовых сcылок JavaScript-программой.
далее...
Basecgi
Базовый адрес и CGI
Особое место в схеме HTTP универсального локатора ресурсов(URL) занимает адресация CGI-скриптов. Дело в том, что путь к ресурсу(см. "Базовый адрес HTML-документа") интерпретируется не только браузером, но и сервером и при этом состоит из нескольких компонентов. Например,:
http://www.kiae.ru/~paul/base.cgi/kuku/ru?kuku+ru
В этом примере скрипт base.cgi находится в домашнем каталоге пользователя paul. При этом за именем скрипта до знака "?" указан еще ряд символов. В этом случае базовым URL для ссылок документа, сгенерированного скриптом, будет не адрес каталога, в котором расположен скрипт, а вся строка до символа "?". Например, ссылка вида: Ссылка на скрипт
будет ссылаться на скрипт с URL -
http://www.kiae.ru/~paul/base.cgi/kuku/ru/base.cgi
Дело в том, что браузер распознает путь как последовательность символов от доменного имени или порта до конца строки или символа "?", в то время как сервер работает со скриптами несколько иначе. Все множество символов от имени скрипта до символа "?" помещается сервером в переменную окружения PATH_INFO, которую можно использовать в качестве дополнительного условия при генерации отклика или перенаправлении запроса.
Этот прием достаточно часто используется на Web-узлах, которые размещают у себя чужую рекламу. Типичным примером такого сорта можно считать сервер infoart(www.infoart.ru). Рекламные банеры этого Web-узла вызывают скрипты, которым через PATH_INFO передают URL рекламодателя для перенаправления запроса.
Другой пример - www.reklama.ru. Типичная ссылка на рекламный банер здесь может выглядеть следующим образом: </a>
В этом URL cgi-bin - это типовой каталог размещения CGI-скриптов, href - скрипт, а cit - значение переменной PATH_INFO.
далее...
This is an insecure document that is not encrypted and offers no security protection.
и при доступе через telnet:
telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.net.kiae.su.
Escape character is '^]'.
GET /~paul/http/content.htm HTTP/1.0
HTTP/1.1 200 OK
Date: Sat, 09 May 1998 01:34:12 GMT
Server: Apache/1.2.5 rus/PL22.2
Connection: close
Content-Type: text/html; charset=windows-1251
Vary: accept-charset, user-agent
kuku
Connection closed by foreign host.
Как видно из последнего примера, в заголовке нет изменений относительно типа кодовой страницы. Netscape подставил информацию о кодовой странице тела сообщения уже позже того, как страницы принял.
далее...
Cookie
Виртуальный сеанс
Механизм Cookie был введен в употребление компанией Netscape в качестве компенсации отсутствия реального сеанса работы между браузером и сервером в рамках протокола HTTP.
Согласно модели взаимодействия "клиент-сервер", которая выбрана для этого протокола, клиент и сервер устанавливают соединение только на момент обслуживания одного запроса клиента.
Представим теперь ситуацию, в которой при обращении к информационным ресурсам сервера требуется аутентификация пользователя. В локальной системе достаточно один раз ввести идентификатор и пароль, чтобы получить разрешение на работу. Интерфейс пользователя, который постоянно связан с системой доступа, обеспечивает сеанс, в рамках которого действует аутентификация. При работе в Web сервер после ответа на запрос "забывает" о клиенте. Это означает, что аутентификацию нужно проходить каждый раз, когда обращаешься к ресурсу. Первоначально выход из положения был найден в виде невидимых полей HTML-форм. Введенная при первом обращении информация передавалась клиентом и сервером друг другу при каждом обращении. Но этот подход неудобен тем, что постоянно нужно вызывать скрипт, который будет обрабатывать поля форм.
Решение было найдено в виде механизма Cookie. Суть его проста: при обращении к серверу браузер в отклике в заголовке HTTP-сообщения получает Cookie. Этот "волшебный ключик" сохраняется браузером и при следующем обращении к серверу передается в заголовке HTTP-запроса. К каждому ключику можно приписать URL, для которого он действует, время жизни, в течение которого он действителен, имя домена, для которого ключик действителен и атрибут типа соединения (защищенное или нет), по которому ключик передается.
В контексте элементов разметки заголовка Cookies нас интересуют с точки зрения их использования в элементе META. Cookie выдается сервером, следовательно он(ключик) появляется в отклике сервера, что означает возможность использования операторов установки Cookie в META-таге. Синтаксис Cookie при этом будет выглядеть следующим образом:
В принципе, для работы с Cookie даже не обязательно пользоваться услугами http-сервера. В языке управления сценариями просмотра гипертекстовых страниц JavaScript существует возможность управления Cookie из программ, встроенных в HTML-документ. Рассмотрим простой пример:
Centre
test
В данном случае выставляется три ключика в заголовке документа(id, id1 и id2). При нажатии на кнопку можно посмотреть на эти значения если Вы разрешили своему браузеру принемать cookie. Манипулирование ключиками в JavaScript (Учебник "Введение в JavaScript") позволяет преодолеть их "вырезание" proxy-серверами. META позволяет выставить начальные значения ключиков. При этом, можно воспользоваться механизмом Server Site Includes(SSI) и вставлять META через него.
При использовании Cookie необходимо не только передать ключик клиенту, но и получить его обратно. Proxy-сервер может контролировать оба направления. Поэтому при возврате приходится передавать значение ключика, кроме стандарного способа (через заголовок HTTP-запроса), еще и нестандарным. Например, через значения HTML-форм.
далее...
Elements
Основные контейнеры заголовка
Основные контейнеры заголовка - это элементы HTML-разметки, которые наиболее часто встречаются в заголовке HTML-документа, т.е. внутри элемента разметки HEAD.
Мы рассмотрим только восемь элементов разметки, включая сам элемент разметки HEAD:
HEAD(элемент разметки HEAD)
TITLE(заглавие документа)
BASE(база URL)
ISINDEX(поисковый шаблон)
META(метаинформация)
LINK(общие ссылки)
STYLE(описатели стилей)
SCRIPT(скрипты)
Наиболее часто из этого списка применяются элементы TITLE, SCRIPT, STYLE. Применение элемента META показывает осведомленность автора о правилах индексирования документов в поисковых система и возможности управления HTTP-обменом данными. BASE и ISINDEX в последнее время практически не применяются. LINK указывают только при использовании внешних относительно данного документа описателей стилей.
далее...
Expires
Время хранения
При кэшировании документов proxy-сервером или браузером необходимо вместе с документом передавать временную отметку, до которой данный документ соответствует тому, что хранится на исходном сервере. При рассмотрении Cache-Control этим вопросам уделено основное внимание. В данном разделе речь идет только об утановке времени годности документа через META-таг.
Проверить данную установку не представляется сложным. Достаточно посмотреть на информацию о документе, которую дает обычный браузер:
Location:
http://www.kiae.ru/~paul/test.htm
File MIME Type:
text/html
Source:
Currently in disk cache
Local cache file:
MV2V1ADH.HTM
Last Modified:
05/10/98 03:00:00 Local time
Last Modified:
05/10/98 00:00:00 GMT
Content Length:
310
Expires:
05/11/98 00:00:00
Charset:
windows-1251
Security:
This is an insecure document that is not encrypted and offers no security protection.
Строчка "Expires" отображает дату, которая была установлена в МЕТА-таге. Оператор Expire не позволяет отличить кэширующий сервер от обычного браузера.
далее...
Head
Элемент разметки HEAD
Элемент разметки HEAD содержит заголовок HTML- документа. Данный элемент разметки не является обязательным. При наличии тага начала элемента разметки желательно использовать и таг конца элемента разметки. По умолчанию элемент HEAD закрывается, если встречается либо таг начала контейнера BODY, либо таг начала контейнера FRAMESET. Атрибутов у тага начала контейнера нет, хотя в DTD HTML один необязательный атрибут и прописан. Синтаксис контейнера HEAD в общем виде выглядит следующим образом:
контейнеры заголовка
Контейнер заголовка служит для размещения информации, относящейся ко всему документу в целом. Необязательный атрибут profile указывает на внешний файл мета-тагов. В качестве значения этого атрибута указывается URL этого файла.
далее...
Headm
Назначение заголовка
Заголовок HTML-документа является необязательным элементом разметки. В HTML 2.0 предлагалось вообще отказаться от элементов HEAD и BODY. В то время в HTML не было элементов, которые использовались одновременно и в заголовке, и в теле документа. Современная практика HTML-разметки такова, что практически в каждом документе есть HTML-заголовок.
Первоначально существование заголовка определялось необходимостью именования окна браузера. Это достигалось за счет элемента разметки TITLE:
this is the title
...
...
Отображение содержания элемента TITLE.
Однако, задумывался заголовок для несколько иных целей. Исходя из общих соображений, связанных с теорией и практикой разработки и эксплуатации гипертекстовых систем, все гипертекстовые связи информационных узлов принято разделять на контекстные и общие.
Контекстные гипертекстовые связи привязаны к определенному месту документа - контексту. В HTML такие связи реализованы в виде гипертекстовых ссылок (элемент A(anchor)). Фактически, до реализации таблиц описателей стилей в современных браузерах это был единственный вид связей, которыми мог управлять автор HTML-документа.
Общие гипертекстовые связи опеределяются не частью документа (контекстом), а всем документом целиком. Например, быть предыдущим по отношению к другому документу или следующим - это общая гипертекстовая связь, которая позволяет организовать так называемый "линейный" просмотр информационных узлов гипертекстовой сети.
Реализация такого сорта ссылок уже долгое время является частью проектов W3C(Arena,Amaya). В коммерческих браузерах такой механизм реализован только для описателей стилей (элемент разметки LINK).
Важную роль заголовок HTML-документа играет в JavaScript. Существует принципиальная разница между заголовком и телом документа при использовании элемента разметки SCRIPT. Она заключается в определении зоны видимости функций и переменных. Переменные и функции, определенные в заголовке документа, относятся ко всему окну браузера. Это значит, что к ним можно обратиться из любого места документа и изменить их значения. Кроме того, к ним можно обратиться из другого окна или фрейма. Фактически, это глобальные переменные. Перменные и функции тела документа доступны только в момент формирования документа при загрузке его браузером и после завершения загрузки не доступны в браузерах третьих версий (Netscape Navigator 3.0, например). При работе со слоеными документами переменные и функции тела относятся к слоям, что делает доступ к ним неудобным.
Еще одной функцией заголовка HTML-документа является управление HTTP-обменом через элемент разметки META. При современной практике размещения Web-узлов компаний на серверах провайдеров администраторы этих узлов могут не иметь возможности управлять программой-сервером. В этом случае остается только одна возможность управления обменом - через заголовок HTML-документа.
В заключении нельзя не упомянуть еще об одном важном назначении заголовка HTML-документа - поисковом образе документа для индексировании роботами поисковых систем. Элемент META позволяет хранить списки ключевых слов и описания документа, которые будут использоваться для составления индекса поисковой системы и появляться в качестве описания документа в случае выдачи ссылки на него при поиске по ключевым словам.
далее...
Htmlstr
Структура HTML-документа
Язык гипертекстовой разметки HTML опирается на контейнерную схему описания документа, которая задана в стандарте обобщенного языка разметки SGML(Standard Generalized Markup Language). В этой схеме любой документ может быть представлен в виде набора вложенных контейнеров. Контейнер, в терминологии SGML - элемент, состоит из тага начала контейнера, тага конца контейнера и содержания контейнера, заключенного между тагами начала и конца. Рассмотрим следующий приме р:
Типовой HTML-документ
content="text/html;charset=windows-1251">
Типовой HTML-документ
...
В этом примере весь документ заключен в контейнер(элемент разметки) HTML и состоит из двух частей: заголовка документа и тела документа. Заголовок заключен в контейнер(элемент разметки) HEAD, в то время как тело документа заключено в контейнер(элемент разметки) BODY.
Можно выделить несколько типов HTML-документов:
классический;
слоеный;
набор фреймов.
Исторически первым был классический документ. Потом появился набор фреймов. Формат слоеного документа был разработан последним. Все форматы документов предполагают наличие элемента разметки HTML, который определяет начало и коней HTML-документа.
В настоящее время достаточно много страниц на Web-узлах, которые не содержат элементов разметки HTML, HEAD, и BODY. Это произошло из-за пренебрежения правилами разметки в первые годы существования Web авторами, которые создавали свои Web-узлы, не утруждая себя изучением стандартов. Браузеры, в частности Mosaic, обрабатывали такие страницы, используя стихийно сложившиеся правила умолчания, которые в последствии были закреплены в стандарте языка HTML 2.0. При использовании этих правил предполагается, что авт
ор работает с классическим HTML-документом.
Классический документ
Классический документ состоит из заголовка документа (элемент разметки HEAD) и тела документа (элемент разметки BODY). Схематично это выглядит следующим образом:
...
...
До стандарта HTML 3.2 элементы разметки тела документа нельзя было употреблять в теле и, наоборот, элементы разметки тела документа нельзя было употреблять в заголовке. В настоящее время такие элементы разметки, как BASE или SCRIPT можно применять как в теле документа, так и в заголовке документа.
Слоеный документ
Слоеные документы появились самыми последними. Они позволяют создавать документы, у которых содержание одного раздела может "наезжать" на содержание другого раздела. Слоеные документы имееют формально структуру классического документа, но внутри тела содержат либо элементы разметки LAYER (браузер Netscape), либо позиционированные разделы при помощи каскадных таблиц стилей.
Пример с применением элемента LAYER
...
...
...
Пример с применением CSSR
...
...
...
Этот раздел страницы выполнен как слой.
Этот раздел страницы выполнен как слой.
Наиболее эффектно слоеные документы смотрятся при программировании содержания страниц на JavaScript или JScript.
Набор фреймов
У набора фреймов вместо контейнера BODY контейнер FRAMESET. Внутри элемента FRAMESET применяются элементы FRAME. Каждый FRAME содержит HTML-документ, который может быть любого рассмотренного нами типа.
Рассмотрим пример набора фреймов:
Right Frame
Top Frame
Bottom Frame
Как видно из примера набор фреймов может делить окно браузера достаточно гибко на прямоугольные области, которые не могут пересекаться между собой.
Заголовок - общая часть всех HTML-документов
Заголовок HTML-документа, элемент разметки HEAD, формально присутствует во всех типах HTML-документов. Это связано с необходимостью описания некоторых общих свойств документов. Как правило, эта информация не отображается, но используется для управления процессом отображения.
далее...
Http
Управление HTTP-обменом.
Прежде всего следует сказать несколько слов о HTTP-обмене, т.е. об обмене данными между браузером и сервером по протоколу HTTP(HyperText transfer Protocol).
Обмен производится по средством HTTP-сообщений. Сообщение состоит из двух частей: заголовка сообщения и тела сообщения. Заголовок - это фрагмент текста, который состоит из директив поротокола HTTP. Тело - это либо запрос пользователя (сообщение отправляется от браузера серверу), либо запраштваемый документ (сообщение отправляется от сервера клиенту). Тело следует за заголовком и отделяется от него пустой строкой.
При использовании элемента META с атрибутом http-equiv подразумевается, что значение этого тага задает имя директивы заголовка HTTP-сообщения, а атрибут content - значение этого оператора. Внешне это так и выглядит:
Создается впечатление, что размещенный в заголовке HTML-документа оператор заголовка HTTP-сообщения действительно попадет на свое место при HTTP-обмене. Следовательно, автор документа имеет возможность вмешаться в сам процесс обмена данными между сервером и клиентом. При более детальном рассмотрении оказывается, что это не совсем верно.
Для того, чтобы убедиться в этом, воспользуемся тем фактом, что заголовок HTTP-сообщения является набором строк ASCII-символов. Это значит, что если клиентом telnet зайти на TCP-порт, на котором осуществляет обслуживание запросов HTTP-сервер, то можно увидеть отклик сервера и обнаружить присутствие или отсутствие тех или иных операторов заголовка.
Проверим установку Expires. Для этого вставим в заголовок документа следующий МЕТА-таг:
При обращении к серверу через telnet обнаруживаем, что данная конструкция не попадает в заголовок HTTP-сообщения:
IRIS 4% telnet www.kiae.ru 80
Trying 144.206.192.11...
Connected to www.kiae.ru.
Escape character is '^]'.
HEAD /~paul/http/expire.html HTTP/1.0
HTTP/1.1 200 OK
Date: Fri, 08 May 1998 19:56:47 GMT
Server: Apache/1.2.5 rus/PL22.2
Connection: close
Content-Type: text/html; charset=windows-1251
Vary: accept-charset, user-agent
Connection closed by foreign host.
При просмотре свойств документа в браузере мы обнаруживаем, что установка отмены кэширования произошла:
Location:
http://www.kiae.ru/~paul/http/expire.html
File MIME Type:
text/html
Source:
Currently in disk cache
Local cache file:
M1B7GGBM.HTM
Last Modified:
Unknown
Last Modified:
Unknown
Content Length:
118
Expires:
Thursday, May 07, 1998 21:50:01
Charset:
windows-1251
Security:
This is an insecure document that is not encrypted and offers no security protection.
Таким образом ,браузер сам анализирует содержание заголовка документа и хранит свойства, связанные с данным документом. Такое поведение браузера накладывает определенные ограничения на применение META для размещения операторов HTTP-заголовка.
Первым и самым очевидным ограничением является невозможность разместить в META операторы заголовка запроса клиента. Например, такой оператор как Allow. Документ приходит с сервера, и значения META могут только переназначить значения существующих операторов или добавить новые операторы отклика сервера, но не запроса клиента.
Реальный отклик сервера не содержит значений из META. Это значит, что если в нем есть оператор "Connection: close", то соединение закроется вне зависимости от того, что будет дополнительно указано в МЕТА.
Подводя некоторый итог, можно сказать, что в META с атрибутом http-equiv имеет смысл использовать только общие операторы заголовка HTTP-сообщения, операторы отклика сервера и операторы описания содержания. Операторы запроса клиента использовать в META смысла не имеет.
Введение
Данный учебный курс посвящен применению элементов разметки заголовка документа. При этом, основное внимание уделяется вопросам использования элемента разметки META для управления обменом данными через протокол HTTP и прописованию поисковых образов документов для индексирования роботами поисковых систем.
При разработке этого курса учитывалоcь, что информация заголовка, за исключением содержания элемента разметки TITLE, не отображается браузером, и читатели страниц Web-узлов ее не видят. Тем не менее, многие важные моменты из жизни страниц зависят от содержания заголовка. Это и указание типа кодировки документа для правильного отображения браузером (директива Content-type), и описание (аннотация документа, директива Description), и список ключевых слов (директива Keywords), и базовая часть гипертекстовых ссылок (элемент разметки BASE), и автоматическое обновление содержания страницы (директива Refresh), и многое другое.
Некоторые возможности заголовка документа в настоящее время утратили свою актуальность и перестали широко использоваться при проектировании современных Web-узлов. Но существует еще достаточное количество старых Web-узлов и довольно большое число пользователей старых версий браузеров, которые привыкли многие вещи видеть с позиции HTML 2.0
Не следует думать, что заголовок отомрет в скором времени. Заголовок документа - это место, куда помещают информацию, относящуюся ко всему документу в целом, а не к отдельным его частям. Тенденция усложнения заголовков прослеживается во всех стандартах Internet. Достаточно обратить внимание на почтовый стандарт MIME, чтобы в этом убедиться. По этой причине освоение современных методов использования HTML-заголовка имеет большое практическое значение и абсолютно необходимо для подготовки специалистов по проектированию, разработке и сопровождению Web-узлов.
далее...
Isact
Вызов скрипта через атрибут action
Атрибут action в контейнер ISINDEX был введен компанией Microsoft по аналогии с одноименным атрибутом в HTML-формах. Action позволяет указать имя скрипта, который будет обрабатывать запрос непосредственно в контейнере ISINDEX. На первый взгляд этот способ указания поисковой программы проще, чем реализация через SSI. Но практика разработки и опубликования интерфейсных страниц делает оба способа с точки зрения трудоемкости равноценными.
Дело в том, что и поисковый шаблон и результаты поиска должны отображаться на одной странице. В способе SSI это достигается за счет включения скрипта внутрь документа, т.е. прямое совмещение HTML-документа и результатов поиска, которые подставляются вместо скрипта. При использовании атрибута action скрипт загрузит новую страницу.
В этом случае поступают следующим образом: скрипт генерирует точную копию страницы, будто бы она хранится в файловой системе сервера:
#!/usr/local/bin/perl
print "Content-type: text/html\n";
print "Pragma: no-cache\n\n";
print "
";
print "";
print "";
print "
Test ISINDEX
";
if(length($ENV{"QUERY_STRING"})==0)
{
die;
}
$str = "grep ".$ENV{QUERY_STRING}." \* \|";
open OUT, $str;
while()
{
print $_," ";
}
close OUT;
print "";
Cкрипт в атрибуте action вызывает сам себя. В качестве базового адреса здесь используется адрес самого скрипта. В принципе такой скрипт можно замаскировать под HTML-документ, если разместить файл с расширением htm или html в стандартной директории скриптов или реализовать через модуль rewrite преобразование адреса. Более жизненные примеры требуют анализа входного запроса и разбора отклика поискового скрипта.
далее...
Isindex
Элемент разметки ISINDEX
Элемент разметки ISINDEX используется для задания поискового шаблона и унаследован от ранних версий HTML. В HTML 4.0 этот контейнер не определен. Утрата данного контейнера объясняется широким применением форм и CGI-скриптов. Тем не менее все браузеры его поддерживают.
Шаблон ввода ключевых слов при наличии данного контейнера в заголовке HTML-документа отображается в виде дополнительного поля ввода рабочей области браузера, что нарушает компоновку HTML-страниц, выполненных с применением современных средств разметки. Лучше всего ISINDEX подходит для документов с компоновкой стиле HTML 2.0.
...
Применение элемента ISINDEX
В классическом варианте при использовании ISINDEX список ключевых слов, которые вводятся в поисковом шаблоне и разделены символом "+", присоединяется к базовому адресу HTML-документа после символа "?".
http://kuku.ru/isindex.html?keyword+list
Очевидно, что сам HTML документ не способен произвести поиск. Это может выполнить только поисковая программа.
Присоединение запроса к документу унаследовано от первого сервера CERN, в котором оно использовалось по аналогии с поисковыми серверами Gopher. Современный подход, основанный на HTML-формах, позволяет указывать URL поисковой программы, что дает большую свободу при разметке страниц.
Современный синтаксис ISINDEX позволяет использовать аналогичный формам подход. Для этой цели в таге начала контейнера ISINDEX можно указать атрибут action.
Однако, и традиционная форма контейнера также позволяет обращаться к внешним CGI-скриптам. Сделать это можно в совокупности либо с контейнером BASE, либо с использованием Server Site Includes(SSI).
В первом случае для всего документа устанавливается базовый URL поисковой программы. Все URL гипертекстовых ссылок на другие страницы задаются в полной форме или базовый адрес переназначается после ISINDEX. Это вполне оправдано, если данная страница ничего, кроме поискового критерия и ссылки на домашнюю страницу Web-узла не содержит.
Во втором случае в документ встраивается обращение к CGI-скрипту, который реализует функции поисковой программы. Такое совмещение - реальность современного подхода к компоновке поисковых страниц. Как правило, и поисковый шаблон, и результаты поиска отображаются на одной странице, т.к. это позволяет корректировать запрос по мере получения результатов поиска. Встроенный в страницу скрипт анализирует переменные окружения сервера, и в случае отсутствия запроса может вообще никак не обозначать свое присутствие внутри документа.
[an error occurred while processing this directive]
Таг начала элемента может содержать два необязательных атрибута: action и prompt. Синтаксис элемента ISINDEX в общем виде выглядит следующим образом:
Второй необязательный атрибут тага начала ISINDEX - prompt. Он позволяет вместо стандартного приглашения к вводу ключевых слов задать приглашение, которое по мнению автора документа лучше отражает суть поискового шаблона. Например, можно задать приглашение к вводу ключевых слов на русском языке.
Применение атрибута prompt
ISINDEX - отмирающий элемент разметки. Однако, он определил формат обмена данными ISINDEX. Данные в этом формате передаются от браузера серверу в случае применения ISINDEX и в случае прямого указания дополнительных параметров после символа "?" в гипертекстовой ссылке.
далее...
Isssi
Вызов скрипта через SSI
Реализация поиска через Server Site Incledes и ISINDEX опирается на тот факт, что в качестве поискового скрипта при ISINDEX, если не указан атрибут action формально вызывается тот же самый документ, в котором ISINDEX указан. Список ключевых слов при этом присоединяется к URL данного документа после символа "?". Это и есть одна из форм HTTP-запроса браузера к серверу по методу доступа GET, которая носит название ISINDEX.
Сам HTML-документ при этом будет выглядеть следующим образом:
ISINDEX
Тестирование контейнера ISINDEX
Как видно из этого текста, в нем нет даже намека на вызов скрипта. Если все оставить так как есть, то действительно ничего не будет работать, но если вставить HTML-комментарий формата SSI, то тогда мы получим страницу со скриптом:
ISINDEX
Тестирование контейнера ISINDEX
[an error occurred while processing this directive]
В данном случае grep.cgi очень простой скрипт. Это просто вызов программ grep по текущему каталогу при условии если указан поисковый критерий, т.е. если есть запрос после "?", то скрипт отработает и выдаст результаты, если нет, то страница останется девственной, т.к. скрипт ничего не подставит вместо себя.
Сама программа grep.cgi при этом может выглядеть примерно следующим образом:
#!/usr/local/bin/perl
print "Pragma: no-cache\n\n";
if(length($ENV{"QUERY_STRING"})==0)
{
die;
}
$str = "grep ".$ENV{"QUERY_STRING"}." \* \|";
open OUT, $str;
while()
{
print $_;
}
close OUT;
В данном случае идея программы проста. Сначала проверяем наличие запроса после символа "?". Этот запрос помещается сервером в переменную окружения QUERY_STRING. Если длина строки в QUERY_STRING равна 0, то запроса нет, в противном случае вызываем команду grep и распечатываем результат ее работы.
При реализации следует учесть, что ключевых слов может быть много, что они могут быть на русском языке, и их придеться перекодировать, что результат работы grep следует предварительно разобрать и подготовить в HTML-формате для размещения внутри страницы.
далее...
Link
Элемент разметки LINK
Элемент разметки LINK - это давняя попытка придать HTML академический вид. Согласно теории гипертекстовых систем все гипертекстовые связи разделяют на два типа: контекстные связи и общие связи. Такое деление чисто условное и опредляется тем, что контекстную связь можно привязать к определенному месту документа, а общую связь можно отнести только ко всему документу целиком. Если взглянуть на проблему связи чуть шире, то очевидной становится аналогия с отношениями. Гипертекстовая связь задает отношение на множестве информационных узлов.
Контекстная связь определяет отношение на паре узлов. При этом, в модели World Wide Web один из узлов является источником, а второй - мишенью. Собственно это и отражено в названии элемента разметки A(anchor), который определяет гипертекстовую ссылку(не путать с гипертекстовой связью). При этом, в контекстной связи один и тот же термин может идентифицировать разные связи. Например, в контексте содержания конспекта данной темы слово "HEAD" определяет документ head.htm, который описывает контейнер HEAD и особенности его применения, а в контексте справочника по данной теме слово "HEAD" будет означать ссылку на описание синтаксиса данного контейнера.
Общие ссылки нельзя привязать по контексту. Например, два информационных узла находятся в отношении следования, т.е. при "линейном" просмотре одна Web-страница является следующей для другой Web-страницы. В этом случае речь идет о страницах целиком, а не отдельных их частях. Такой же общей связью является принадлежность к Web-узлу, который ассоциируется со своей домашней страницей.
В информационно-поисковых системах поисковый термин определяет отношение "быть заиндексированным данным термином", которое также задает связь соответствующих документов.
В настоящее время в браузерах не существует единообразного способа программирования или определения общих гипертекстовых связей. В течение последних 5 лет W3C строит уже второй браузер, который должен продемонстрировать возможность программирования икон меню браузера(вперед, назад и т.п.). Однако, производители наиболее популярных браузеров такой поддержки через HTML-разметку в своих программах не предлагают.
Существенный сдвиг в данном направлении произошел после реализации поддержки описателей стилей в Netscape Navigator и Internet Explorer четвертых версий. CSS(Cascade Style Sheets) позволяют определять для различных типов гипертекстовых связей вид гипертекстовых ссылок. При этом возможно определение различных типов контекстных ссылок. Кроме этого, впервые нашел осмысленное применение контейнер LINK. Он позволил загружать внешние описатели стилей:
В данном случае речь идет о загрузке стилей из файла css.htm. При этом, стили определены в нотации W3C, а не JavaScript, что определяется атрибутом type. Если говорить более обще, то атрибут rel определяет тип гипертекстовой связи, атрибут href указывает адрес документа, идентифицирующего связь, а атрибут type определяет тип содержания этого документа.
В общем случае контейнер LINK может имет следующий вид:
Для различных типов содеражания действия по интерпретации элемента разметки будут различными. В настоящее время идет процесс осмысления и разработки спецификаций описания метаданных, где возможно применение элемента разметки LINK.
далее...
Meta
Элемент разметки META
Это наиболее популярный элемент разметки заголовка. По частоте встречаемости он уступает только элементу TITLE. Такое положение дел объясняется назначением данного элемента разметки. META содержит управляющую информацию, которую браузер использует для правильного отображения и обработки содержания тела документа.
Исторически первым полезным использованием контейнера META стала принудительная перезагрузка документа браузером через заголовок HTTP-сообщения. В заголовке HTTP-сообщения можно указать оператор Refresh. Время, заданное как параметр этого оператора, определяет интервал в секундах, после которого браузер загружает документ, определенный атрибутом url данного оператора. Впервые этот механизм был реализован на сервере CERN, но наибольшую популярность приобрел при использовании сервера WN.
В контейнере META этот механизм реализуется следующим образом:
content="1; url=refresh.htm">
Открыть окно примера с Refresh
В данном случае, через одну секунду после загрузки документа браузер должен инициировать загрузку страницы refresh.htm.
Используя этот механизм, можно построить автоматически перезагружаемую последовательность страниц. Для этого в заголовке каждой страницы из этой последовательности следует разместить соответствующий контейнер META.
content="1; url=refreshX.htm">
Заглавная буква "Х" в слове "refreshX.htm" - это цифра номера кадра. На странице нулевого кадра в этом месте следует указать на первый кадр (refresh1.htm), на странице первого кадра - на второй (refresh2.htm) и т.д..
Появление Windows95 и Windows NT 4.0 c их поддержкой таблиц UNICODE сделало возможным указание типа кодировки документа - charset. К сожалению, на многих Unix-платформах этот механизм не работает, и часто приводит вообще к ошибкам, например в IRIX версий 6.2-6.4.
Снобистское отношение поклонников Unix к этой возможности ничем не оправдано, т.к. основная масса пользователей российской части Internet использует Windows для просмотра документов World Wide Web. Для перекодировки на стороне клиента (документ подготовлен в cp1251) в заголовок документа необходимо включить META-таг следующего вида:
Приведенный выше пример - это типичное использование операторов заголовка HTTP-сообщения. Однако, здесь тоже следует быть осторожным. Большинство российских Web-узлов используют в качестве HTTP-сервера Russian Apache. Эта модификация сервера поддерживает перекодировку "на лету" документов для правильного отображения на стороне клиента. Russian Apache сам вставляет в HTTP-заголовок (не путать с HEAD) директиву Content-type. Если в документе будет META элемент c указанием типа кодировки, а Apache перекодировал содержание, то возможно несоответствие между указанным в META типом кодировки и реальной кодировкой содержания документа.
Кроме Content-type можно указать и другие операторы. Например, запретить кэширование документа. Необходимость в этом возникает при частом обновлении документа или при наличии в нем SSI-вставок с коротким временем жизни. Для запрета кэширования достаточно вставить в заголовок META-таг вида:
Pragma - это наследие HTTP 1.0. В новой версии протокола HTTP (HTTP 1.1) управление кэшированием осуществляется через оператор Cache-Control. Для получения такого же эффекта, как и в случае с Pragma, в заголовке HTML-документа достаточно указать:
Новый механизм управления кэшированием и хранением документа на стороне клиента гораздо более гибок, чем это было реализовано в HTTP 1.0. Например, можно запретить хранение документа после пересылки:
Аналогично кэшированию можно задать время последней модификации(Last-Modified) или дату истечения актуальности документа(Expire). Более подробно об операторах заголовка HTTP-сообщения рассматривается в теме "Управление HTTP-обменом".
С появлением роботов поисковых машин на META-таг была возложена еще одна функция - описание поискового образа документа. Наиболее последовательно это было впервые реализовано в Webcrawler. До этого в качестве поискового образа документа использовался либо весь список слов документа, либо слова первого абзаца.
Собственно для описания документа используется два META-тага. Один определяет список ключевых слов, а второй - реферат( краткое содержание документа), который отображается в качестве пояснения к ссылке на документ в отчете поисковой машине о выполненом запросе. Контейнер TITLE здесь также используется в качестве названия документа.
Web-инжиниринг.META-tag
content="Учебный цикл WEB-инжиниринг. Тема: Заголовок HTML-Документа. Элемент разметки META. Дается краткое описание основных способов применения контейнера META в заголовке HTML-докумета. Рассматривается управление HTTP-обменом и индексирование документов.">
При индексировании такого документа содержание контейнера TITLE и атрибутов content контейнеров META после фильтрации попадет в индекс поисковой машины и может быть использовано для составления запросов. Процесс фильтрации отбракует так называемые stop-слова и общие слова. Они не попадут в индекс поисковой машины. Например, будут отбракованы предлоги или, если речь идет о тематическом поисковом индексе, например, по технологиям World Wide Web, то в него не попадут: web, web-технология и т.п..
Мета-тагом пользуются и программы подготовки документов. Они размещают в нем свой идентификатор. В общем случае контейнер META выглядит следующим образом:
Практика показывает, что при индексировании можно указывать одновременно и атрибут name и атрибут http-equiv с одинаковыми значениями. Это связано с тем, что одни роботы индексирования анализируют содержание META-элемента по атрибуту name, а другие по атрибуту http-equiv.
далее...
Modify
Время последнего изменеия
В ряде случаев дата обновления документа в кэше сервером явно не указывается. Это и понятно, если речь идет о текстовом документе, который изменяется не по жестко заданному алгоритму. В этом случае браузер или кэширующий сервер при вычислении даты истечения годности будет опираться на время последней модификации документа. Это время задается директивой Last-Modified заголовка HTTP-отклика сервера. В данном разделе речь идет только об установке времени годности документа через META-таг.
Проверить данную установку не представляется сложным. Достаточно посмотреть на информацию о документе, которую дает обычный браузер:
Location:
http://www.kiae.ru/~paul/test.htm
File MIME Type:
text/html
Source:
Currently in disk cache
Local cache file:
MV2V1ADH.HTM
Last Modified:
05/10/98 03:00:00 Local time
Last Modified:
05/10/98 00:00:00 GMT
Content Length:
310
Expires:
05/11/98 00:00:00
Charset:
windows-1251
Security:
This is an insecure document that is not encrypted and offers no security protection.
Строчка "Last-Modified" отображает дату, которая была установлена в МЕТА-таге. При установке даты последней модификации документа формат даты должен соответствовать либо RFC-1123, либо RFC-850, либо ANSI C. Это замечание справедливо для всех дат, которые задаются в META-тагах (Expires, Cache-Control, Set-Cookie).
далее...
Pod
Поисковый образ документа
Поисковый образ документа - это множество терминов, которые приписывают данному документу и используют при составлении запросов на информационно- поисковом языке(ИПЯ). В настоящее время в Internet применяется два типа ИПЯ: координатные и булевы.
При координатном поиске запрос представляет из себя список терминов, которые называют ключевыми словами. Этот список сравнивается со списками терминов документов. При этом для каждого документа вычисляется степень его соответствия запросу(формальная релевантность) в соответствии с которой все ссылки на документы ранжируются. В качестве ключевого термина может быть использовано и устойчивое словосочетание, например, "World Wide Web". В этом случае оно называется ключевой фразой или ключевым словосочетанием. С точки зрения системы поиска оно не отличается от обычного ключевого слова. В информационных системах типа Altavista такой поиск обычно называют простым.
При булевом поиске слова и фразы соединяются операторами булевой алгебры, которые в данном контексте принято называть логическими коннекторами. При этом их смысл можно проиллюстрировать на диаграммах Эйлера.
Весь прямоугольник соответствует всему множеству документов. Элипсы - множеству документов, содержащих слова или словосочетания "World Wide Web", "Web", "технология" соответственно. Пересечение элипсов - это документы, которые содержат оба слова (запрос типа "Web and технология"). Элипс "технология" без пересечения с элипсом "Web" - документы, содержащие слово "технология", но не содержащие слово "Web"(запрос типа "технология not Web"). Объединение элипсов это все документы, которые содержат либо слов "Web", либо слово "технология", либо оба слова одновременно ( запрос типа "Web or технология"). В принципе, возможен запрос типа "not ( Web and технология)". В этом случае речь идет о документах, которые не содержат ни одного из указанных в запросе терминов, т.е. лежат за пределами элипсов.
Последний вариант запроса реализован далеко не во всех поисковых системах и нужно внимательно читать подсказки, чтобы определить с каким типом not вы можете иметь дело. Оператор not может быть двух местной операцией или одноместной. При этом чисто внешне в запросах их отличить сложно. Но при двухместном not запрос последнего типа не может быть выполнен.
В Internet встречаются и более сложные системы индексирования и поиска, чем выше описанные, но они носят либо исследовательский характер, либо являются переносом традиционных технологий в сетевую среду.
Среди логических коннекторов некоторые системы позволяют использовать и позиционные коннекторы. Эти операторы учитывают взаимное расположение слов в тексте относительно друг друга. Довольно часто такой поиск называют полнотекстовым, что скорее носит рекламный характер, чем отражает реальное положение дел. Степень "полнотекстовости" в данном случае определяется числом параметров, которые хранятся на каждое слово документа. Исследования англоязычных текстов показали, что существенного улучшения результатов поиска при использовании позиционных параметров не происходит. Это утверждение верно при условии что, пользователь ориентируется с лексике выбранной тематической области и знает что он хочет получить.
далее...
Поисковый образ документа" указано, что
Список ключевых слов
В теме " Поисковый образ документа" указано, что поисковым образом документа является список ключевых слов. В принципе, поисковые системы, используя системы автоматического индексирования, могут сами определить термины для этого списка, опираясь на существующий у них массив терминов и термины тела документа. Однако, META-таг дает возможность автору документа самому назначить список терминов индексирования. Для этого нужно вставить META-таг в заголовок HTML-документа:
Большинство поисковых систем определяют список ключевых слов в заголовке по наличию META-тага с атрибутом name="Keywords". Но есть и такие, что требуют присутствия атрибута http-equiv="Keywords". Сам список при этом выбирается из атрибута content.
Не следует думать, что все термины, указанные в этом META-таге станут элементами поискового образа документа. В поисковых системах существуют списки "stop"-слов и общих слов. "Stop"-слова - это общеупотребительные слова языка, например, предлоги. Общие слова - это слова, которые для данной тематической области имеют высокую частоту встречаемости в документах(более 70% от объема всего набора поисковых образов). Ни "stop"-слова, ни общие слова в поисковый образ документа не попадают, хотя и могут быть указаны в META-таге.
Как работуют системы идексирования можно ознакомиться, воспользовавшись локальным вариантом системы Altavista, или обратиться к режиму индексирования реальных информационных систем.
далее...
После выполнения поискового запроса система
Аннотация документа
После выполнения поискового запроса система выдает список ссылок на документы, которые этому запросу соответствуют. Обычно кроме ссылки выдается также название документа (выбирается из контейнера TITLE) и краткое описание его содержания. В качестве такого описания выбирается содержание контейнера META, который имеет либо атрибут name="Description", либо http-equiv="Description". В принципе, в одном таге можно указывать оба атрибута.
Если такого тага нет в заголовке документа, то в качестве описания документа используется, как правило, первый абзац документа. В этом смысле типичным примером является сервер www.citforum.ru, где в качестве описания выдается фраза: "Море аналитической информации".
Данный МЕТА-таг используется также для составления поискового образа документа, как и META-таг с атрибутом name="Keywords". К словам описания применяются те же процедуры, что и к терминам из спика ключевых слов.
Часто в качестве описания документов используются заголовки параграфов и глав этих документов.
Pragma
Управление кэшированием(Pragma)
Pragma - директива заголовка HTTP-сообщения, которая позволяет запретить кэширование данного документа. Данная директива является общей директивой заголовка HTTP-сообщения в HTTP/1.0, других значений, кроме no-cahce, не имеет:
В протоколе HTTP 1.1 данная директива заменена директивой Cache-Control со значением no-cache. Большинство серверов и клиентов поддерживают эту директиву и правильно ее отрабатывают.
Для запрета на кэширование иногда не достаточно применения директив управления кэшированием. Так Netscape кэширует документы или их компоненты даже при наличии директив Cache-Control и Pragma. Для того, чтобы заставить перечитать компонент страницы (он ведь получается с сервера по самостоятельному HTTP-запросу) можно установить директиву Expires
далее...
Script
Элемент разметки SCRIPT.
Элемент разметки SCRIPT служит для размещения кода JavaScript, VBScript или JScript. Вообще говоря, SCRIPT можно использовать не только в заголовке документа, но в его теле. В отличие от контейнера STYLE, ему не требуется дополнительный контейнер LINK для загрузки внешних файлов кодов. Это можно сделать непосредственно в самом контейнере SCRIPT:
Существует несколько скриптовых языков: JavaScript, VBScript, JScript. По умолчанию подразумевается JavaScript. Подробнее о JavaScript и контейнере SCRIPT можно ознакомиться в учебном курсе "Введение в JavaScript".
далее...
Search
Реализация шаблона поиска
Элемент разметки ISINDEX - это анохронизм, который остался в современных браузерах для совместимости со старыми Web-узлами. ISINDEX является самым первым механизмом, который позволял вводить данные читателю страниц Web-узла. В момент появления Web-технологии единственной целью ввода данных на стороне браузера являлось формирование списка ключевых слов в качестве запроса для информационно-поисковой системы.
Собственно это вытекало из задач самого проекта создания интегрированной информационной системы CERN, которая объединяла архив научных публикаций, стандарты и регламентирующие документы, а также информационно-поисковую систему ALICE.
После появления форм и спецификации CGI(Common Gateway Interface) появилась возможность создания гораздо более сложных шаблонов ввода данных, нежели это было предусмотренно в ISINDEX. Тем не менее с методической и практической точки зрения задача реализация поисковых механизмов через этот элемент разметки черезвычайно интересна и полезна.
Есть еще один аспект, который следует учитывать. В современной практике разработки Web-узлов стали появляться различные стили(речь в данном случае не о CSS). Условно их можно разделить на классику, модерн, авангард и т.п.. Вообщем все как у "взрослых". Естественно, что среди этих стилей есть и стиль ретро. Вот в рамках этого стиля применение ISINDEX вполне уметсно.
далее...
Style
Элемент разметки STYLE
Элемент разметки STYLE предназначен для размещения описателей стилей. При этом, описание стиля из этого элемента разметки, если оно совпадает по имени класса и/или идентификатору подкласса со стилем, описанном во внешнем файле, заменяет описание стиля из внешнего файла. С точки зрения влияния на весь документ описатели стилей задают правила отображения контейнеров HTML-документа для всей страницы.
В настоящее время контейнер используется только с одним атрибутом type, который задает тип описателя стиля. Это может быть либо text/css, либо text/javascript. Если элемент разметки открыт тагом начала, то он должен быть закрыт тагом конца. В общем виде запись элемента STYLE имеет следующий вид:
Применению стилей в HTML-разметке, а также проектированию Web-узлов с применением CSS посвящен отдельный учебный курс нашего Web-узла - "Каскадные таблицы стилей".
далее...
Title
Элемент разметки TITLE
Элемент разметки TITLE служит для именования документа в World Wide Web. Более прозаическое назначение этого элемента - именование окна браузера, в котором просматривается пользователем документ. Состоит контейнер из тага начала, содержания и тага конца. Наличие тага конца обязательно. Таг начала элемента не имеет специфических атрибутов.
В различных браузерах алгоритм отображения элемента TITLE может отличаться. Так в некоторых руководствах встречается рекомендация по реализации бегущей строки в заголовке документа за счет указания нескольких последовательных контейнеров TITLE: R
Ro
Rol
Roll
Rolli</title>
...
Rolling Strin</title>
Rolling String</title>
Такой механизм не отрабатывает на современных компьютерах. При этом следует учитывать, что в отличии от реализации "бегущей" строки средствами JavaScript, лидирующие пробелы в заголовке игнорируются.
При выборе текста для содержания контейнера TITLE следует учитывать, что отображается он системным фонтом, т.к. является заголовком окна браузера. В нелокализованных версиях операционных систем и графических оболочек русский текст содержания элемента TITLE будет отображаться абракадаброй.
Синтаксис контейнера TITLE в общем виде выглядит следующим образом: название документа
Заголовок не является обязательным контейнером документа. Его можно опустить. Роботы многих поисковых систем используют содержание элемента TITLE для создания поискового образа документа. Слова из TITLE попадают в индекс поисковой системы. Из этих соображений элемент TITLE всегда рекомендуется использовать на страницах Web-узла.
далее...
Массивы
Массивы делятся на встроенные(document.links[], document.images[],...) и определяемые пользователем (автором документа). Встроенные массивы мы подробно обсуждаем в разделах "Программируем картинки", "Программируем формы" и "Программируем гипертекстовые переходы". Поэтому подробно остановимся на массивах, определяемых пользователем. Для массивов определено несколько методов:
join()
reverse()
sort()
и свойство length, которое позволяет получить число элементов массива. Это свойство активно используется в примерах данного раздела. Например, при обсуждении метода join().
Для определения массива пользователя существует специальный конструктор:
a = new Array();
b = new Array(10);
c = new Array(10,"Это значение");
Пример использования:
document.f.i.size=c[0];
document.f.i.value=c[1];
Как видно из этого примера, массив может состоять из разнородных элементов. Массивы не могут быть многомерными.
Для работы с массивами в JavaScript применяются методы join(), reverse(), sort(), а также массивы обладают свойством длины length.
Метод join()
Метод join() позволяет объединить элементы массива в одну строку. Он является обратной функцией к методу split(), который применяется к объектам типа STRING. Рассмотрим пример преобразования локального URL в URL схемы http:
window.location:
document.write(window.location.href+" ");
document.write("Выполнили: b = window.location.href.split('/'); ");
b = window.location.href.split("/")
document.write(" Получили массив b: ");
for(i=0;i");
document.write("
Последний пример показывает, что массив пользователя можно получить и без явного применения конструктора массива. Массив элементов строки получается просто как результат действия функции split().
начало страницы
Метод reverse()
Метод reverse() применяется для изменения на противоположный порядка элементов массива внутри массива. Предположим, массив натуральных чисел упорядочен по возрастанию:
a = new Array(1,2,3,4,5);
Упорядочим его по убыванию:
a.reverse();
a = new Array(1,2,3,4,5);
a.reverse();
for(i=0;i");
Можно, наверное, придумать и более разумный пример, но, к сожалению, на практике встречаться с этим методом приходилось не часто.
начало страницы
Метод sort()
Как это принято в современных интерпретируемых языках, например в Perl, метод sort() позволяет отсортировать элементы массива в соответствии с некоторой функцией сортировки, чье имя используется в качестве аргумента метода:
a = new Array(1,6,9,9,3,5);
function g(a,b)
{
if(a > b) return 1;
if(a < b) return -1;
if(a==b) return 0;
}
b = a.sort(g);
В результате выполнения этого кода получим массив следующего вида:
a = new Array(1,6,9,9,3,5);
function g(a,b)
{
if(a > b) return 1;
if(a < b) return -1;
if(a==b) return 0;
}
b = a.sort(g);
for(i=0;i");
Возможность задания произвольной функции сортировки дает возможность гибкого анализа строковых объектов. Одним из таких примеров может служить анализ строки атрибута src контейнера IMG, если картинка подставляется скриптом, и сортировка полей формы по значениям:
Аналогичные манипуляции можно проделать с любым массивом. Если не указывать функции в аргументе метода сортировки, то элементы массива сортируются в лексикографическом порядке. Это значит, что они сначала преобразуются в строки, а только потом сортируются.
Bimage
Картинки
Кнопки-картинки - это те же кнопки, но только с возможностью отправки данных на сервер.
Собственно такие кнопки в JavaScript составляют две разновидности контейнера input: image и submit. В JavaScript объект, связанный с данными кнопками, называется SUBMIT.
Активная кнопка:
Как мы уже отмечали, данный объект обладает теми же свойствами, методами и событиями, что и объект BUTTON. Но вот реакция в разных браузерах при обработке событий может быть разная. Так, в событии onClick в Explorer можно отменить передачу данных на сервер, выдав в качестве значения возврата false. Navigator на такое поведение обработчика события вообще никак не реагирует, и отменять передачу можно только в атрибуте onSubmit контейнера FORM:
Активная кнопка:
Наиболее интересной особенностью графических кнопок является их способность передавать в запросе на сервер координаты точки, в которую указал пользователь, нажимая на кнопку мышью. К сожалению, обработать такое поведение кнопки в JavaScript-программе не удается.
Тип браузера(Объект Navigator)
В связи с войной браузеров стала актуальной задача настройки страницы на конкретную программу просмотра. При этом возможны два варианта: определение типа браузера на стороне сервера и определение типа браузера на стороне клиента. Для последнего варианта в арсенале объектов JavaScript есть объект Navigator. Этот объект - свойство объекта window.
Рассмотрим простой пример определения типа программы просмотра:
При нажатии на кнопку отображается окно предупреждения. В нем(окне) - строка userAgent, которую браузер помещает в соответствующий HTTP-заголовок.
Эту строку можно разобрать по составным компонентам:
Список свойств Navigator:
navigator.appName
navigator.appCodeName
navigator.appVersion
navigator.userAgent
Значение свойства:
У объекта navigator есть еще несколько интересных с точки зрения программирования применений. Например, проверка поддержки Java:
document.write(" ");
if(navigator.javaEnabled()==true) document.write("Ваша программа поддерживает исполнение Java-апплетов");
if(navigator.javaEnabled()==false) document.write("Ваша программа не поддерживает исполнение Java-апплетов");
Измените теперь настройки поддержки Java в вашем браузере и перезагрузите страницу. После этого обратите внимание на последнее предложение предыдущего параграфа.
Аналогично можно проверить форматы графических файлов, которые поддерживает ваш браузер:
document.write("
");
if(navigator.mimeTypes['image/gif']!=null) document.write("Ваш браузер поддерживает GIF ");
if(navigator.mimeTypes['image/kuku']==null) document.write("Ваш браузер не поддерживает KUKU");
К сожалению, такая проверка не позволяет определить наличие автоматической подгрузки графики.
Кнопки
Использование кнопок в Web вообще не мыслимо без применения JavaScript. Создайте форму с кнопкой и посмотрите, что будет, если на эту кнопку нажать:
Кнопка продавливается, но ничего не происходит. Ни одно из стандартных событий формы(reset или submit) не вызывается. Конечно, данное замечание не касается кнопок Submit и Reset.
Кнопка вводится в форму главным образом для того, чтобы можно было обработать событие click:
Название кнопки определяется атрибутом value контейнера input. С этим атрибутом связано свойство value объекта BUTTON. Любопытно, что согласно спецификации изменять значение этого атрибута нельзя. Однако, в версии 4 Netscape Navigator и Internet Explorer такое изменение допустимо.
только в Navigator размер кнопки фиксирован (первое значение должно быть самым длинным, иначе будет не очень красиво), а в Explorer размер изменяется в зависимости от длины текста. начало страницы
Программируем "за кадром"
Обычно описание языка программирования начинают с типов и структур данных, операторов и функций, а заканчивают библиотеками стандартных функций (главным образом, ввода/вывода) и опциями компилятора. В своем описании JavaScript мы вывернули эту схему наизнанку и рассказываем об этом в конце нашего курса.
Многое из того, чему посвящены страницы этого раздела, так или иначе уже использовалось в других частях. Здесь мы соберем все вместе. Теперь основное внимание мы уделим:
типам и структурам данных
операторам языка
функциям пользователя
особенностям размещения кода
возможности исполнения программ в фоновом режиме
управлению фокусом
и вопросам безопасности
Как видно из этого перечня, первые три позиции полностью посвящены формальному описанию языка, в то время как следующие четыре призваны показать наличие "подводных камней" при использовании JavaScript. начало страницы
Изменение картинки
Изменить картинку можно только присвоив свойству src встроенного объекта IMAGE новое значение. На странице "Программирование графики" показано, как это происходит в простейшем случае. При этом замечено, что медленная перезагрузка картинки с сервера не позволяет реализовать быстрое листание. Теперь мы попробуем решить эту проблему.
Собственно решение заключается в разведении по времени подкачки страницы и ее отображения. Для этой цели используют конструктор объекта IMAGE:
Фрагмент кода перед примером показывает типовой прием замещения и восстановления картинки при проходе мыши. Естественно, что менять можно не одну, а сразу несколько картинок, что и демонстрирует пример. При этом мы используем не только картинки, но и вложенные таблицы. Вообще говоря,
данная страница довольно тяжелая для обработки браузером.
Главное, тем не менее, не в том, что картинки замещаются, а в том с какой скоростью они это делают. Для достижения нужного результата в начале страницы были созданы массивы картинок, в которые графика была перекачена перед отображением(обратите внимание на строку статуса при загрузке страницы):
color = new Array(32);
mono = new Array(32);
for(i=0;i<32;i++)
{
mono[i] = new Image();
color[i] = new Image();
if(i.toString().length==2)
{
mono[i].src = "../images/jsi/mapb0"+i+".gif";
color[i].src = "../images/jsi/mape0"+i+".gif";
}
else
{
mono[i].src = "../images/jsi/mapb00"+i+".gif";
color[i].src = "../images/jsi/mape00"+i+".gif";
}
}
Еще один характерный прием - применение функции отложенного исполнения JavaScript-кода(eval()):
function def()
{
for(i=0;i<32;i++)
{
eval("document.m"+i+".src="mono["+i+"].src");
" }
for(i="0;i
" {
eval("document.r"+i+".src=rm["+i+"].src");
}
}
В" данном случае eval() экономит наши усилия по набору операций присваивания (32 строки - это не фунт изюму).
Обработка события Click
Вообще говоря, обработчик события Click в современном JavaScript не нужен. Можно прекрасно обойтись URL-схемой "javascript", которая была специально придумана для перехвата события гипертекстового перехода. Обработчик onClick следует рассматривать как реликт, доставшийся в наследство от предыдущих версий языка, который поддерживается в "пожилых" версиях Netscape Navigator и Internet Explorer.
Основная задача обработчика данного события - перехват события гипертекстового перехода. Если функция обработки данного события возвращает значение true, то переход происходит, при значении false - переход не происходит:
Отменим переход в начало страницы описания события обработчика onClick onClick
А теперь дадим пользователю право выбора перехода в начало страницы посредством окна подтверждения: перехода
Обратите внимание на место применения функции window.confirm() - аргумент команды return. Логика проста: функция возвращает значение true или false, и именно оно подставляется в качестве аргумента. Если просто написать функцию без return, то ничего работать не будет.
Можно ли вообще обойтись одним обработчиком onClick без использования атрибута href? Видимо нет. Первое, что необходимо браузеру - это определение типа контейнера A. Если в нем есть только атрибут name, то это якорь, если присутствует атрибут href - ссылка. Это два разных объекта. Они имеют различные составляющие, в том числе и обработчики событий. В контексте текущего раздела нам нужна именно ссылка, т.е. контейнер A с атрибутом href. Проверим наше предположение:
Cookies
Волшебные ключики или Cookies не являются полями формы, но тем не менее, отойдя от строго рассмотрения иерархии объектов JavaScript, мы уделим им немного внимания, как одному из механизмов управления обменом данных. Основная функция Cookie - поддержка сеанса работы между клиентом(браузером) и сервером.
Cookie - это небольшой фрагмент текста, который передается от сервера браузеру и потом может быть возвращен обратно. Подробно о cookie можно прочитать в "Спецификация Cookie". Программа на JavaScript способна прочитать выставленное значение Cookie и даже изменить его. Для этой цели используют свойство объекта DOCUMENT - cookie:
В данном случае cookies отображаются в виде одной большой строки со множеством значений. Свойство cookies документа можно переопределить:
function asign()
{
document.cookie="n1=3";
window.alert(document.cookie);
}
...
Как видно из примера программисту не нужно выделять cookie из строки. Браузер рассматривает cookies как ассоциированный массив(хеш) и изменяет значение cookie по имени "ключика".
Наконец, cookie можно удалить. Если быть более точным - деактивировать, указав время действие cookie:
function change_cookies()
В данном случае мы гасим cookie за счет параметра expire(времени, до которого cookie живет). Так как мы берем текущее время, то cookie исчезает из списка "ключиков". Многократно нажимая на кнопку, можно удалить все cookies для данной страницы.
Типы и структуры данных
Как и любой другой язык программирования JavaScript поддерживает встроенные типы и структуры данных. Все их многообразие можно подразделить на:
литералы и переменные
массивы, функции и объекты
При этом все они делятся на встроенные и определяемые программистом. Функции и объекты рассматриваются в разделах "Функции" и "Объекты". Поэтому здесь мы сосредоточимся на литералах, переменных и массивах.
Литералы
Литералом называют данные, которые используются в программе непосредственно. При этом под данными понимаются числа или строки текста. Все они рассматриваются в JavaScript как элементарные типы данных. Приведем примеры литералов:
числовой литерал: 10
числовой литерал: 2.310
числовой литерал: 2.3e+2
строковый литерал: 'Это строковый литерал'
строковый литерал: "Это строковый литерал"
Литералы используются в операциях присваивания значений переменным или операциях сравнения:
var a=10;
var str = 'Hy!!!';
if(x=='kuku') window.alert(x);
Два варианта строковых литералов необходимы для того, чтобы использовать вложенные строковые литералы. Вообще говоря, есть подозрение, что равноправие "..." и '...' мнимое. Если внимательно посмотреть на реализацию страниц программирования гипертекстовых ссылок(href.htm,path.htm и mouse.htm), то нетрудно заметить, что вместо прямого переназначения гипертекстовой ссылки литералом типа '...' там используется косвенное переназначение через функцию литералом "...":
...
Это связано с особенностями реализации Netscape. Дело в том, что прямое переназначение неправильно отображает кириллицу в win32, а вот косвенное работает. Похоже, что "..." разрешает анализ информации внутри строкового литерала JavaScript-интерпретатором, а '...' - нет.
Если быть более точным, то следует сказать, что строка - это объект. У этого объекта существует великое множество методов. Строчный литерал и строчный объект - это далеко не одно и тоже. При применении к строчным литералам методов строчных объектов происходит преобразование первых в последние.
начало страницы
Переменные
Переменные в JavaScript могут быть определены назначением или при помощи оператора var:
i=10;
var i;
var i=10;
var id = window.open();
var a = new Array();
Как видно из примеров, переменные могут принимать самые разные значения, при этом тип переменной определяется контекстом.
Переменная является свойством окна. Например, мы можем открыть окно, определить в нем новую переменную и использовать ее:
В данном примере при проходе мышки через картинки меню они изменяются. Этот эффект достигается за счет применения двух событий: onMouseover и onMouseout. По первому событию картинка меняется с позитива на негатив, по второму событию восстанавливается первоначальный вариант. Следует заметить, что события определены в контейнере якоря (A), а не в контейнере IMG. Это наиболее устойчивый с точки зрения совместимости браузеров вариант.
Для разнообразия рассмотрим еще один пример. В нем мы будем менять статическую картинку при прохождении мыши по меню:
Скрытая картинка, кроме всего прочего, еще и контекстно-зависимая гипертекстовая ссылка. Картинка "запоминает" последнюю позицию меню, на которую указывала мышь. При этом поле формы служит для демонстрации этой контекстной зависимости. "Покликайте" на различные варианты картинки и на иконки меню. Посмотрите, что из этого получится.
Focus
");
wid.document.write("");
wid.document.write("");
wid.document.write("");
wid.document.write("");
wid.document.write("");
wid.document.close();
}
Данный фрагмент кода размещен в каждом из двух фреймов, которые отображаются в примере. А их ровно два. Просто ширина границы набора фреймов установлена в 0. Если окно примера разделить мысленно примерно пополам и "кликнуть" мышью в одну из половин, то пойдут часы в этой половине. Если теперь переместиться в другой фрейм и "кликнуть" мышью в нем, то часы пойдут в поле формы этого фрейма, а в другом фрейме остановятся. начало страницы
Фокус в полях формы
Управление фокусом в полях формы кроме этого раздела изложено еще и в разделе "Текст в полях ввода". Здесь мы рассматриваем этот вопрос в контексте общего применения методов blur() и focus(). Эти методы определены для любого поля формы, а не только для полей ввода. Рассмотрим простой пример:
Фамилия:
Имя:
Отчество:
Пол:
мужскойженский
Попробуйте изменить в этой форме значение любого из полей. Вряд ли это будет возможно. Обработчик события Focus (onFocus) уводит фокус из поля на произвольное место страницы.
Form
Программируем формы
Если рассматривать программирование на JavaScript в исторической перспективе, то первыми объектами, для которых были разработаны методы и свойства, стали поля форм. Обычно контейнер FORM и поля форм именованы:
поэтому к ним в программах на JavaScript обращаются по имени:
window.document.f_name.i_name.value="Текстовое поле";
Если нажать на строку кода, которая расположена выше, то в поле формы, расположенном выше появится текст Текстовое поле.
Тот же эффект можно достичь используя массив форм загруженного документа:
window.document.forms[0].elements[0].value="Текстовое поле";
В данном примере не только к форме, но и к полю формы мы обращаемся как к элементу массива.
Рассмотрим подробнее объект FORM, который соответствует контейнеру FORM.
Свойства
Методы
События
action
method
target
elements[]
encoding
reset()
submit()
onReset
onSubmit
Сами по себе методы, свойства и события объекта FORM используются нечасто. Их переопределение обычно связано с реакцией на изменения значений полей формы.
action
Свойство action отвечает за вызов скрипта (CGI-скрипта). В нем указывается его (скрипта) URL. Но там где можно указать URL, можно указать и его схему "javascript":
document.write("По умолчанию установлен метод "+document.m.method+". ");
В данном примере стоит обратить внимание на два момента:
Прежде чем нажимать на кнопку открытия окна предупреждения, следует выбрать кнопку "Метод POST". Если этого не сделать, то появится сообщение об ошибке JavaScript. Здесь все выглядит достаточно логично. Формирование URL происходит при генерации события submit, а вызов скрипта происходит после того, как событие сгенерировано. Поэтому вставить переопределение метода в обработчик события нельзя, т.к. к этому моменту будет уже сгенерирован URL, который , в свою очередь будет JavaScript-программой с символом "?" на конце. Переопределение метода должно произойти раньше, чем произойдет событие submit.
В тело документа встроен через контейнер SCRIPT JavaScript-код, который сообщает метод доступа, установленный в форме по умолчанию. Этот контейнер расположен сразу после контейнера FORM. Ставить его перед контейнером FORM нельзя, т.к. в момент получения интерпретатором управления объект FORM не будет создан, и, следовательно, манипулировать с его свойствами не представляется возможным.
В остальном никаких других особенностей свойство method не имеет. В свойстве method можно указать и другие методы доступа, отличные от GET и POST, но это требует дополнительной настройки сервера.
начало страницы
target
Свойство target определяет имя окна, в которое следует загружать результат обращения к CGI-скрипту. Применение значения этого свойства внутри JavaScrip-программ не оправдано, т.к. всегда можно получить идентификатор окна или использовать встроенный массив frames[0] и свойства окна opener, top, parent и т.п.. Для загрузки внешнего файла в некоторое окно всегда можно применить метод window.open(). Но тем не менее, поэксплуатировать это свойство можно:
В примере организован цикл перебора имен фреймов. Если имя совпадает с выбранным именем, то фрейм считается выбранным.
начало страницы
elements[]
При создании встроенного в документ объекта FORM браузер создает и связанный с ним массив полей формы. Обычно к полям обращаются по имени, но можно также обращаться и по индексу массива полей формы:
Как видно из этого примера начинается индексирование полей в массиве с цифры "0". Общее число полей в форме доступно как результат обращения document.forms[i].elements.length.
начало страницы
encoding
Не смотря на то, что такое свойство у объекта FORM есть не очень понятно как его осмысленно использовать. Изменение свойства encoding оправдано только в том случае, когда в форме есть поле типа file. В этом случае предполагается, что пользователю разрешена передача файла со своего локального диска на сервер. При этом если не указана кодировка multipart/form-data, то передаваться будет только имя файла, а если она указана, то сам файл тоже.
Первое, что приходит в голову по этому поводу - отмена передачи файла при определенном стечении обстоятельств. При этом сам скрипт нужно размещать во внешнем файле, чтобы пользователь не изменил его код.
начало страницы
reset()
Метод reset(), не путать с обработчиком события onReset, позволяет установить значения полей формы по умолчанию. При этом не требуется использовать кнопку типа reset:
В данном примере по гипертекстовой ссылки происходит возврат в форме значений умолчания.
начало страницы
submit()
Метод submit() позволяет проинициировать передачу введенных в форму данных на сервер. При этом метод submit инициирует тот же процесс, что и нажатие на кнопку типа submit. Это позволяет отложить выполнение передачи данных на сервер:
Вообще говоря, можно написать скрипт, который будет передавать данные без ведома пользователя, используя метод submit(). Однако, браузер выдает предупреждение о таком поведении кода на странице.
начало страницы
onReset
Событие reset(восстановление значений умолчания в полях формы) возникает при нажатии на кнопку типа reset или при выполнении метода reset(). В контейнере FORM возможно переопределить функцию обработки данного события. Для этой цели в него введен атрибут onReset:
В этом примере следует обратить внимание на то, что обработчик события reset возвращает логическое значение false. Это сделано для того, чтобы перехватить обработку события reset полностью. Если обработчик события возвращает значение false, то установка полей по умолчанию не производится, если обработчик событий возвращает значение true, то установка значений полей по умолчанию производится.
начало страницы
onSubmit
Событие submit возникает при нажатии на кнопку типа submit, графическую кнопку(тип image), или при вызове метода submit(). Для переопределения метода обработки события submit в контейнер FORM добавлен атрибут onSubmit. Функция, определенная в этом атрибуте будет выполняться перед тем как отправить данные на сервер. При этом в зависимости от того, что эта функция вернет в качестве значения, данные либо будут отправлены, либо - нет.
В этом примере следует обратить внимание на конструкцию return test();. Сама функция test() возвращает значения true или false. Соответственно, данные либо отправляются на сервер, либо нет.
Функции
Язык программирования не может обойтись без механизма многократного использования кода программы. Такой механизм обеспечивается процедурами или функциями. В JavaScript функция выступает в качестве одного из основных типов данных. Одновременно с этим в JavaScript определен объект Function.
В общем случае любой объект JavaScript определяется через функцию. Для создания объекта используется конструктор, который в свою очередь вводится через Function. Таким образом, с функциями в JavaScript связаны следующие ключевые вопросы:
Функция - тип данных
Функция - объект
Конструкторы объектов
Именно эти вопросы мы и рассмотрим в данном разделе.
Функция - тип данных
Определяют функцию при помощи ключевого слова function:
function f_name(arg1,arg2,...)
{
/* function body */
}
Здесь следует обратить внимание на следующие моменты. Во-первых, function определяет переменную f_name. Это переменная имеет тип "function":
document.write("Тип переменной f_name:"+typeof(f_name);
function f_name()
{
/* function body */
}
document.write("Тип переменной f_name:"+typeof(f_name));
Во-вторых, этой переменной присваивается значение:
document.write("Значение i:"+i.valueOf());
var i=10;
function f_name(a)
{
if(a>=0) return true; else return false;
}
document.write("Значение переменной f_name:"+i.valueOf()+" ");
document.write("Значение переменной f_name:"+f_name.valueOf()+" ");
В данном случае метод valueOf() применяется как к числовой переменной i, так и к f_name. По этой причине функции можно назначить синоним путем присваивания ее значения другой переменной:
function f_name(a)
Совершенно очевидно, что если функцию можно присвоить переменной, то ее можно передать и в качестве аргумента другой функции. Все это усиливается при использовании функции eval(), которая позволяет реализовать отложенное исполнение JavaScript-кода. Отложенное исполнение - это возможность изменения программы по ходу ее исполнения. Типичным использованием eval() является сокращение кода за счет генерации однотипных строк:
for(i=0;i
{
eval("document.write('kuku"+i+" ')");
}
Результат исполнения кода:
for(i=0;i')");
}
Если бы мы кодировали "в лоб", то пришлось бы написать пять строк кода. Данный подход был использован в разделе "Изменение картинки" для инициирования массивов картинок, имена которых построены по принципу индексации ячеек таблицы.
начало страницы
Функция - объект
У любого типа данных JavaScript существует объектовая "обертка" - wrapper, которая позволяет применять методы типов данных к этим переменным и литералам, а также получать значения их свойств. Например, длина строки символов определяется свойством length. Аналогичная "обертка" есть и у функций - объект Function.
Например, увидеть значение функции можно не только при помощи метода valueOf(), но и используя метод toString():
function f_name(x,y)
{
return x-y;
}
document.write(f_name.toString()+" ");
Результат распечатки:
function f_name(x,y)
{
return x-y;
}
document.write(f_name.toString()+" ");
Свойства функции доступны для программиста только тогда, когда они вызываются внутри функции. При этом обычно имеют дело с массивом аргументов функции (arguments[]), его длиной (length), именем функции, вызвавшей данную функцию (caller)и прототипом (prototype).
Рассмотрим пример использования списка аргументов функции и его длину:
function my_sort()
{
a = new Array(my_sort.arguments.length);
for(i=0;i
a[i] = my_sort.arguments[i];
b = a.sort();
return b;
}
b = my_sort(9,5,7,3,2)
for(i=0;i
document.write("b["+i+"]="+b[i]+" ");
Результат исполнения:
function my_sort()
{
a = new Array(my_sort.arguments.length);
for(i=0;i");
Если функция может быть вызвана из различных других функций, то в этом случае используется свойство caller:
function slave()
{
document.write(slave.caller+" ");
return slave.caller;
}
function master1()
{
slave();
}
function master2()
{
slave();
}
...
master1();
master2();
Результат исполнения двух последних строк:
function slave()
{
document.write(slave.caller+" ");
return slave.caller;
}
function master1()
{
slave();
}
function master2()
{
slave();
}
master1();
master2();
Еще одним свойством объекта Function является prototype, но это общее свойство всех объектов, поэтому и обсуждать его мы будем в контексте типа данных Object. Упомянем только о конструкторе объекта Function:
f = new Function(arg_1,...,arg_n, body)
Здесь f - это объект класса Function. Его можно использовать и как обычную функцию. Конструктор используют для получения безымянных функций, которые назначают или переопределяют методы объектов. Здесь мы вплотную подошли к вопросу конструирования объектов. Дело в том, что переменные внутри функции можно рассматривать в качестве ее свойств, а функции - методов:
function Rectangle(a,b,c,d)
{
this.x0 = a;
this.y0 = b;
this.x1 = c;
this.y1 = d;
this.area = new Function("return Math.abs(this.x0-this.x1)*Math.abs(this.y0-this.y1)");
this.perimeter = new Function("return (Math.abs(this.x0-this.x1)+Math.abs(this.y0-this.y1))*2");
}
c = new Rectangle(0,0,100,100);
document.write(c.area());
Результат исполнения:
function Rectangle(a,b,c,d)
{
this.x0 = a;
this.y0 = b;
this.x1 = c;
this.y1 = d;
this.area = new Function("return Math.abs(this.x0-this.x1)*Math.abs(this.y0-this.y1)");
this.perimeter = new Function("return (Math.abs(this.x0-this.x1)+Math.abs(this.y0-this.y1))*2");
}
c = new Rectangle(0,0,100,100);
document.write(c.area()+" ");
Обратите внимание еще на одну особенность - ключевое слово this. Оно позволяет сослаться на текущий объект, в рамках которого происходит исполнение JavaScript-кода. В данном случае это объект c класса Rectangle.
Hform
Скрытая передача данных из форм
Обмен данными в Web-технологии подробно рассматривается в другом курсе - "CGI и Формы". Программирование элементов форм обсуждается в разделе "Программируем формы". В данном разделе мы рассмотрим вопрос о возможности передачи данных, скрытых от пользователя.
Рассмотрим следующий пример:
Фамилия:
Имя:
Отчество:
e-mail:
document.f.h1.value = window.location.href;
document.f.h2.value = window.document.referer;
Нажмите на кнопочку "Подписка" и посмотрите после этого на строку Location вашего браузера. Вы обнаружите там два поля, которых нет в заполняемой вами форме,: h1 и h2. Это уже неприятно, хотя сама информация в них не представляет из себя ничего криминального (location.href и document.referer). Это означает, что в тексте страницы есть вызов функции со строками типа:
Согласно примеру при нажатии на гипертекстовую ссылку произойдет не только выдача сообщения, которое в этой ссылке указано, но и событие Submit для формы. В итоге вы получите два окна предупреждения. Но второе окно вы ведь не просили.
Конечно, бесконтрольной отправки данных можно избежать, введя режим подтверждения отправки. Но, во-первых, многие пользователи его отключают, а во-вторых, можно использовать не формы, а например графику. И эту возможность мы рассматриваем в разделе "Невидимый код".
Hidecode
Невидимый код
Вопрос доступности JavaScript-кода пользователю рассматривается с двух точек зрения: идентификация, как следствие - необходимость скрытия кода, и безопасность пользователя, следовательно - доступность кода.
Приемы программирования со скрытым кодом позволяют решить еще несколько задач, которые не связаны с безопасностью.
Мы будем рассматривать возможность использования скрытого кода без выдачи вердиктов о преимуществе того или иного подхода. Рассмотрим несколько вариантов:
Невидимый фрейм
Код во внешнем файле
Обмен данными посредством встроенной графики.
Строго говоря, первый и последний варианты не являются полным сокрытием кода. Они рассчитаны либо на неопытных пользователей, либо на нелюбопытных, либо на простых смертных. В любом случае не каждый же раз вы будете смотреть исходный текст страницы.
Невидимый фрейм
Технология программирования в невидимом фрейме основана на том, что при описании фреймовой структуры можно задать конфигурацию типа:
При таком размещении страниц по фреймам и фреймов в рабочей области окна левый фрейм займет весь объем рабочей области окна, а содержание правого будет скрыто. Именно в этом невидимом фрейме мы и будем размещать код программы:
При нажатии на кнопку "Пример невидимого фрейма" откроется новое окно. Если присмотреться внимательно к его содержанию, то кроме картинки с правой стороны окна можно увидеть вертикальную границу. Это граница фрейма. Ее можно двигать. В правый невидимый фрейм мы поместили функцию подкачки картинок. Этот прием позволяет докачивать картинки тогда, когда содержание левого фрейма уже отображено. Если функцию разместить в главном окне, то время отображения будет зависеть от многих факторов, например, картинки, размещенные в заголовке документа, браузер начнет перекачивать раньше картинки в теле документа. При последовательном обмене это будет означать увеличение времени загрузки отображаемой части страницы.
начало страницы
Код во внешнем файле
Попав на данную страницу, вы уже использовали программу из внешнего файла. Для того чтобы убедиться в этом, достаточно посмотреть на HTML-разметку данной страницы:
...
Результат исполнения
document.write(window.location);
document.write(" ");
document.write(document.location);
Однако разница все-таки есть и довольно существенная. В том же примере получим длины строковых констант:
Как видим, при обращении к свойству объекта типа URL, а location как раз объект данного типа, длина строки символов после преобразования будет другой.
Optima
Оптимизация отображения.
При программировании графики следует учитывать множество факторов, которые влияют на скорость отображения страницы и скорость изменения графических образов. При этом обычная дилемма оптимизации программ - скорость или размер занимаемой памяти, решается только путем увеличения скорости. О размере памяти как-то не принято думать при программировании на JavaScript.
Из всех способов оптимизации отображения картинок мы остановимся только на нескольких из них:
Оптимизация отображения при загрузке
Оптимизация отображения за счет предварительной загрузки
Оптимизация отображения за счет нарезки изображения
Если первые две позиции относятся в равной степени как к отображению статических картинок, так и к мультипликации, то третий пункт характерен, главным образом, для мультипликации.
Оптимизация при загрузке
Практически любое руководство по разработке HTML-страниц указывает на то, что при использовании контейнера IMG в теле HTML-страницы хорошим тоном является указание атрибутов width и height. Диктуется это порядком загрузки компонентов страницы с сервера и алгоритмом работы HTML-parser. Первым загружается текст разметки. После этого parser разбирает текст и начинает загрузку дополнительных компонентов, в том числе и графики. При этом загрузка различных картинок, в зависимости от типа HTTP-протокола, может идти последовательно или параллельно.
Также параллельно с загрузкой parser продолжает свою работу. Если для картинок заданы параметры ширины и высоты, то можно отформатировать текст и отобразить его в окне браузера. До тех пор пока эти параметры не определены, отображения текста не происходит.
Таким образом, указание высоты и ширины картинки позволит отобразить документ раньше, чем картинки будут получены с сервера. Это дает возможность пользователю читать документ или воспользоваться его гипертекстовыми ссылками до момента полной загрузки(событие load).
С точки зрения Javascript указание размеров картинки задает начальные параметры окна отображения графики внутри документа. Это позволяет воспользоваться маленьким, абсолютно прозрачным образом, для того, чтобы заменить его полноценной картинкой:
Идея состоит в передаче маленького объекта для замещения его большим объектом по требованию.
начало страницы
Предварительная загрузка
Замена одного образа другим часто бывает оправдана только в том случае, когда происходит достаточно быстро. Если перезагрузка длится долго, то эффект, которого хотят добиться, теряется. Для такой быстрой подмены используют возможность предварительной загрузки документа в специально созданный объект класса Image:
Реальный эффект можно почувствовать только при отключении кэширования страниц на стороне клиента (браузера). Кэширование часто используют для ускорения работы со страницами Web-узла. Как правило, загрузка первой страницы - это достаточно длительный процесс. Самое главное, что пользователь в этот момент готов немного подождать. Поэтому кроме графики необходимой только на первой странице ему можно передать и графику, которая на этой странице не отображается. Но зато при переходе к другим страницам узла она будет отображаться без задержки на передачу с сервера.
Описанный только что прием не однозначен. Его оправдывает только то, что если пользователь нетерпелив, то он вообще отключит передачу графики.
начало страницы
Нарезка картинок
Нарезка картинок применяется довольно часто. Она позволяет достигать эффекта частичного изменения отображаемой картинки. Наиболее часто он применяется при создании меню:
Кроме этого эффекта нарезка позволяет реализовать достаточно эффективную мультипликацию на больших картинках. При этом изменяется не весь образ, а только отдельные его части:
Из примера видно, что изменение части образа довольно сильно изменяет скорость отображения. При изменении всей картинки о мультипликации можно говорить достаточно условно.
Path
Изменение части URL
Гипертекстовая ссылка - это объект класса URL. У этого объекта можно изменять и другие свойства.
Проиллюстрируем эту возможность при частичном изменении ссылки. Распечатаем сначала свойство, которое не зависит от протокола(в нашем случае от javascript) document.links[11].pathname:
document.write(window.document.next.document.links[0].pathname);
Если теперь заменить в функции line() href на pathname и убрать "javascript:" из присваемого значения, то все будет работать точно так же, как и в случае с изменением href.
line1(0);
function line1(a)
{
if(a==0)
{
clear();
document.o3.src="../images/jsi/fio.gif";
document.links[15].pathname=
"document.f2.fi1.value=
'Иванов И.И.';void(0);";
document.o4.src="../images/jsi/rpho.gif";
document.links[16].pathname=
"document.f2.fi2.value=
'123-45-67';void(0);";
document.o5.src="../images/jsi/hpho.gif";
document.links[17].pathname=
"document.f2.fi3.value=
'987-65-43';void(0);";
}
...
}
Если обратите внимание на поле status окна браузера, то там нет отличий от случая с атрибутом href.
Списки и падающие меню
Одним из важных элементов интерфейса пользователя является меню. В HTML-формах для реализации меню используются поля типа select(контейнер SELECT, который, в свою очередь, вмещают в себя контейнеры OPTION). Эти поля представляют собой списки вариантов выбора. При этом список может "выпадать" или скролиться внутри окна. Поля типа select позволяют выбрать из списка только одну альтернативу, либо отметить несколько альтернатив. Для управления полями типа select в JavaScript существует объекты SELECT и OPTION.
Эти объекты характеризуются следующими свойствами, методами и событиями:
Объект SELECT
Свойства
Методы
События
form
length
name
options[]
selectedIndex
type
blur()
click()
focus()
onBlur
onChange
onFocus
Объект OPTION
defaultSelected
index
selected
text
value
нет
нет
Мы не будем описывать всех свойств, методов и событий этих двух объектов. Остановимся только на типовых способах применения их комбинаций. Не смотря на то, что объект OPTION в нашей таблице находится ниже, что отражает его подчиненное по отношению к SELECT положение, начнем с описания применения его свойств и особенностей.
Объект OPTION
Объект OPTION интересен тем, что в отличие от многих других объектов JavaScript OPTION имеет конструктор. Это означает, что программист может сам создать объект OPTION:
opt = new Option( [ text, [ value, [ defaultSelected, [ selected ] ] ] ]);
text - строка текста, которая размещается в контейнере LI (
text)
value - значение, которое передается серверу при выборе альтернативы, связанной с объектом OPTION
defaultSelected - альтернатива выбрана по умолчанию(true/false)
selected - альтернатива выбрана(true/false)
На первый взгляд не очень понятно для чего может программисту понадобится такой объект, ведь создать объект типа Select нельзя и, следовательно, нельзя приписать ему новый объект OPTION. Все становится понятным, когда речь заходит об изменении списка альтернатив встроенных в документ объектов SELECT. Делать это можно, т.к. изменение списка альтернатив SELECT не приводит к переформатированию документа. Изменение списка альтернатив позволяет решить проблему создания вложенных меню, которых нет в HTML-формах, путем программирования обычных меню(options[]).
При программировании альтернатив( объект OPTION) следует обратить внимание на то, что среди свойств OPTION нет свойства name. Это означает, что к объекту нельзя обратиться по имени. Отсутствие свойства объясняется тем, что у контейнера OPTION нет атрибута name. К встроенным в документ объектам OPTION можно обращаться только как к элементам массива options[] объекта SELECT.
начало страницы
options[]
Массив options[] - это свойство объекта SELECT. Элементы этого массива обладают теми же свойствами, что и объекты OPTION. Собственно, это и есть объекты OPTION, встроенные в документ. Они создаются по мере загрузки страницы браузером. Программист имеет возможность не только создавать новые объекты OPTION, но и удалять уже созданные браузером:
альтернатива Один
альтернатива Два
альтернатива Три
В данном примере при загрузке страницы с сервера определено три альтернативы. Они появляются, если выбрать поле SELECT. После нажатия на кнопку удаления последней альтернативы("Delete last option") остается только две альтернативы. Если еще раз нажать на кнопку удаления альтернативы, то останется только одна альтернатива и т.д.. В конечном счете, может остаться 0 альтернатив, т.е. вообще пользователь лишится всякого выбора. Кнопка Reset показывает, что альтернативы утеряны бесследно, т.к. после нажатия на эту кнопку содержание поля SELECT не восстанавливается.
Теперь используя конструктор OPTION сделаем процесс обратимым:
function def_f1()
{
document.f1.s1.options[0] = new Option("альтернатива Один","",true,true);
document.f1.s1.options[1] = new Option("альтернатива Два");
document.f1.s1.options[2] = new Option("альтернатива Три");
return false;
}
...
альтернатива Один
альтернатива Два
альтернатива Три
В данном случае мы обрабатываем событие reset(контейнер FORM). При этом создаем новые объекты типа OPTION и подчиняем их объекту SELECT. При этом первый элемент массива должен быть выбран по умолчанию, чтобы промоделировать поведение при начальной загрузке страницы.
В HTML-формах нельзя реализовать подменю. JavaScript позволяет обойти это ограничение и реализовать замену, путем программирования поля Select:
Заказ автомашин Горьковского и Волжского автозаводов
Фирма производитель:
ГАЗ
ВАЗ
Модель:
3102-111
3102-311
31021
3110
Сделан заказ на модель:
В данном примере список моделей автомобилей меняется в зависимости от выбора завода-производителя. Назначение и обновление списка построены по тому же принципу, что и в предыдущем примере с восстановлением значений умолчания, поэтому текст программ мы не приводим. Но с ним, естественно можно ознакомиться, если посмотреть на HTML-разметку этой страницы.
начало страницы
length
В примерах перепрограммирования options[] активно используется свойство объекта SELECT length. Оно определяет количество альтернатив определенных для поля выбора. При помощи этого свойства мы удаляли и восстанавливали списки моделей в примере с автомобилями.
Определим число моделей автомобилей Горьковского автозавода посредством этого свойства:
Число предложенных моделей:
document.f3.i0.value=document.f2.s1.length;
Обратите внимание на контейнер SCRIPT. Он расположен вслед за формой. Если его расположить раньше, то поля формы будут не определены, и мы получим ошибку.
начало страницы
selectedIndex
Свойство объекта SELECT, которое возвращает значение выбранной альтернативы, обозначается как selectedIndex. Это свойство мы уже использовали в примере с автомобилями. Там по этому индексу мы определяли, модель которого из двух автозаводов выбирает пользователь:
Автозавод:
ГАЗ
ВАЗ
Выбрали индекс:
В этом примере обратите внимание на обработчики событий. Сам обработчик onChange мы опишем позже. Главное сейчас не это. Обратите внимание на то, как мы обращаемся к элементам текущей формы. Во-первых, мы используем свойство form объекта SELECT. Мы его специально не обсуждали. Оно указывает на объект FORM, к которому принадлежит поле. Во-вторых, мы ссылаемся на второй элемент формы. К данному моменту он не определен, но событие произойдет только тогда, когда будем выбирать альтернативы. К этому моменту поле уже будет определено. В-третьих, мы ссылаемся на selectedIndex, не указывая полного имени формы. В данном контексте он относится к текущей форме.
начало страницы
onChange
Событие change наступает в тот момент, когда изменяется значение выбранного индекса в объекте SELECT. С изменением этого индекса в полях выбора одной единственной альтернативы на данной странице мы сталкивались неоднократно(selectedIndex и options[]). Данное событие обрабатывается JavaScript-программой, которая указывается в атрибуте onChange контейнера SELECT. В этом контексте интересно посмотреть на то, что происходит, когда мы имеем дело с multiple контейнером select:
Набор канцелярских товаров:
Карандаши
Авторучки
Линейки
Тетради
Стерки
Кнопки
Скрепки
Выбраны позиции:
Обратите внимание на то, когда происходит событие change. Оно происходит каждый раз, когда происходит выбор или отмена альтернативы. Исключение составляет только последовательный выбор альтернатив отмечанием. В этом случае событие происходит в момент отпуска кнопки мыши, и все отмеченные альтернативы становятся выбранными.
начало страницы
selected
Свойство selected объекта OPTION, на котором был построен пример с канцелярскими принадлежностями, может принимать два значения: истина(true) или ложь(false). В примере мы распечатываем индекс выбранной альтернативы, если значение свойства selected у объекта OPTION - true:
Вообще говоря, свойство selected интересно именно в случае поля множественного выбора. В случае выбора единственной альтернативы ее можно получить указанием на свойство selectedIndex объекта SELECT.
начало страницы
text
Свойство text представляет собой отображаемый в меню текст, который соответствует альтернативе:
Список канцелярских принадлежностей:
Карандаши
Авторучки
Линейки
Тетради
Стерки
Кнопки
Скрепки
Выбрали из списка:
В данном примере свойство text выводится в текстовое поле формы.
Src
Размещение кода на HTML-странице.
Главный вопрос любого начинающего программиста: "Как оформить программу и выполнить ее?", или другими словами: "Куда кобылу запрягать?". Попробуем на него ответить как можно проще, но при этом не теряя полноты способов применения JavaScript-кода.
Во-первых, исполняет JavaScript-код браузер. В него встроен интерпретатор JavaScript. Следовательно, выполнение программы зависит от того, когда и как этот интерпретатор получает управление. Это, в свою очередь зависит от функционального применения кода .
В общем случае можно выделить четыре способа функционального применения JavaScript:
гипертекстовая ссылка (схема URL)
обработчик события (handler)
подстановка (entity)(в Microsoft IE не реализована)
вставка (контейнер SCRIPT)
В учебниках по JavaScript обычно начинают описание применения JavaScript с контейнера SCRIPT. Но с точки зрения самого программирования это не совсем правильно, т.к. такой порядок не дает ответа на ключевой вопрос: Как JavaScript-код получает управление? Т.е. каким образом вызывается и исполняется программа, написанная на JavaScript и размещенная в HTML-документе.
В зависимости от профессии автора HTML-страницы и уровня его знакомства с основами программирования возможны несколько вариантов начала освоения JavaScript. Если Вы программист классического толка (С, Fortran, Pascal и т.п.), то проще всего начинать с программирования внутри тела документа, если Вы привыкли программировать под Windows, то в этом случае начинайте с программирования обработчиков событий, если вы имеете только опыт HTML-разметки или давно не писали программ, то тогда лучше начать с программирования гипертекстовых переходов.
URL-схема JavaScript
Схема URL(Uniform Resource Locator) - это один из ключевых элементов Web-технологии. Каждый информационный ресурс в Web имеет свой уникальный URL. URL указывают в атрибуте href контейнера A, в атрибуте src контейнера IMG, в атрибуте action контейнера FORM и т.п.. Все URL подразделяются на схемы доступа, которые зависят от протокола доступа к ресурсу, например, для доступа к FTP-архиву применяется схема ftp, для доступа к Gopher-архиву - схема gopher, для отправки электронной почты - схема smtp. Тип схемы определяется по первому компоненту URL:
http://kuku.ru/directory/page.html
В данном случае URL начинается с http - это и есть определение схемы доступа(схема http).
Основной задачей языка программирования гипертекстовой системы является программирование гипертекстовых переходов. Это означает, что при выборе той или иной гипертекстовой ссылки вызывается программа реализации гипертекстового перехода. В Web-технологии стандартной программой является программа загрузки страницы. JavaScript позволяет заместить стандартную программу на программу пользователя. Для того чтобы отличить стандартный переход по протоколу HTTP от программируемого на JavaScript перехода, разработчики языка ввели в употребление новую схему URL - javascript:
или при нажатии на кнопку типа Submit в форме можно заполнить текстовое поле этой же формы:
В URL можно помещать сложные программы и вызовы функций. Следует только помнить, что схема JavaScript работает не во всех браузерах, а только в версиях Navigator-а и Explorer-а, начиная с четвертой.
Таким образом, при программировании гипертекстового перехода интерпретатор получает управление после того, как пользователь "кликнул" по гипертекстовой ссылке.
начало страницы
Обработчики событий
Программы обработчики событий(handler) указываются в атрибутах контейнеров, с которыми эти события связаны. Например, при нажатии на кнопку происходит событие Click:
В данном примере атрибут onClick определяет программу обработки события Click. Аналогично можно обработать изменение данных в поле меню:
Привет
Пошел вон
В этом примере при выборе альтернативы она(альтернатива) отображается в окне предупреждения. При этом если не происходит смены альтернативы, то окно не появляется, если же был сделан новый выбор, то окно появляется.
Обработчики событий можно указать внутри многих HTML-контейнеров(BODY, IMG, A, FORM и т.п.). При этом особой популярностью пользуются атрибуты onLoad и onUnload контейнера BODY, т.к. позволяют определить действия после загрузки страницы или при переходе на другую страницу.
Таким образом, интерпретатор получает управление после того, как происходит событие, вызванное действиями пользователя, и для которого определен обработчик события.
начало страницы
Подстановки
Подстановка (entity) довольно редко встречается на страницах Web. Тем не менее, это достаточно мощный инструмент генерации HTML-страницы на стороне браузера. Подстановки используются в качестве значений атрибутов HTML-контейнеров. Например, как значение умолчания поля формы, определяющего домашнюю страницу пользователя, будет указан URL текущей страницы:
Подстановки не поддерживаются в Internet Explorer 4.0, поэтому пользоваться ими следует аккуратно. Прежде чем выдать браузеру страницу с подстановками следует проверить тип этого браузера.
В случае подстановки интерпретатор получает управление в момент разбора браузером(компонента parser) HTML-документа. Как только parser натыкается на конструкцию &{..} у атрибута контейнера, он передает управление интерпретатору JavaScript, который, в свою очередь, после исполнения кода это управление parser-у возвращает. Таким образом, эта операции аналогична подкачке графики на HTML-страницу.
Контейнер SCRIPT - это развитие подстановок до возможности генерации текста документа JavaScript-кодом. В этом смысле применение SCRIPT аналогично Server Site Includes, т.е. генерации страниц документов на стороне сервера. Однако здесь мы забежали чуть-чуть вперед. При разборе документа HTML-parser передает управление интерпретатору после того, как встретит таг начала контейнера SCRIPT. Интерпретатор получает на исполнение весь фрагмент кода внутри контейнера SCRIPT и возвращает управление HTML-parser-у для обработки текста страницы после тага конца контейнера SCRIPT.
У контейнера SCRIPT две основные функции:
Размещение кода внутри HTML-документа
Условная генерация HTML-разметки на стороне браузера
Первая функция аналогична декларированию переменных и функций, которые потом можно будет использовать в качестве программ переходов, обработчиков событий и подстановок. Вторая - это подстановка результатов исполнения JavaScript-кода в момент загрузки или перезагрузки документа.
Размещение кода внутри HTML-документа
Собственно особенного разнообразия в размещении кода нет. Его можно разместить либо в заголовке документа, внутри контейнера HEAD, либо - внутри BODY. Последний способ и его особенности будут рассмотрены в "Условная генерация HTML-разметки на стороне браузера". Сосредоточимся поэтому на заголовке документа.
Код в заголовке размещается внутри контейнера SCRIPT:
... Тело документа ...
HTML- комментарии здесь вставлены для защиты от интерпретации данного фрагмента страницы HTML-parser-ом в старых браузерах(у высокого начальства еще встречаются :-)). В свою очередь, конец HTML-комментария защищен от интерпретации JavaScript-интерпретатором(// в начале строки). Кроме этого, в качестве значения атрибута language у тага начала контейнера указано значение "JavaScript". VBScript, который является альтернативой JavaScript - это скорее экзотика, чем общепринятая практика, поэтому этот атрибут можно опустить - значение "JavaScript" принимается по умолчанию.
Очевидно, что размещать в заголовке документа генерацию текста страницы бессмысленно - он не будет отображен браузером. Поэтому в заголовок помещают декларации общих переменных и функций, которые будут затем использоваться в теле документа. При этом браузер Netscape более требовательный и более строгий, чем Explorer. Если не разместить описания функции в заголовке, то при ее вызове в теле документа можно получить ошибку о том, что данная функция не определена.
Приведем пример размещения и использования функции:
Операторы
В этом разделе мы рассмотрим основные операторы JavaScript. Основное внимание при этом мы уделим операторам декларирования и управления потоком вычислений. Без них не может быть написана ни одна JavaScript программа.
Общий перечень этих операторов выглядит следующим образом:
var
{...}
if
while
for
for ... in
break
continue
return
Сразу оговоримся, что этот список не является полным списком операторов JavaScript.
var
Оператор var служит для объявления переменной. При этом переменная может принимать значения любого из разрешенных типов данных. На практике довольно часто обходятся без явного использования var. Переменная соответствующего типа создается путем простого присваивания:
var a;
var a=10;
var a = new Array();
var a = new Image();
Все выше перечисленные примеры использования var верны и могут быть применены в JavaScript программе. Область действия переменной определяется блоком (составным оператором), в котором используется переменная. Максимальная область действия переменной - страница. начало страницы
{...}
Фигурные скобки определяют составной оператор JavaScript - блок. Они одновременно ограничивают область действия переменных, которые определены внутри этих скобок. За пределами блока переменные не видны:
{
var kuku=0;
}
Основное назначение блока - определение тела цикла и тела условного оператора. начало страницы
if
Условный оператор применяется для ветвления программы по некоторому логическому условию. Общий синтаксис:
if(логическое выражение) оператор1; [else оператор2;]
Логическое выражение - это выражение, которое принимает значение true или false. Если оно равно true, то оператор1 исполняется. В квадратных скобках необязательная составляющая оператора if - альтернатива основной ветви вычислений:
if(navigator.appName=="Netscape")
{
window.location.href=http://kuku.ru/netscape.htm;
}
else
{
window.location.href=http://kuku.ru/explorer.htm;
}
Примеры использования условного оператора можно найти, например, в разделе "Тип браузера".
начало страницы
while
Оператор while определяет цикл. Определяется он в общем случае следующим образом:
while(логическое выражение)
оператор;
Оператор, в том числе и составной, - тело цикла. Тело исполняется до тех пор, пока верно логическое условие:
while(flag==0)
{
id=setTimeout("test();",500);
}
Обычно цикл этого типа применяют при выполнении периодических действий до некоторого события.
начало страницы
for
Оператор for - это еще один оператор цикла. В общем случае он имеет вид:
Оператор в теле цикла может быть блоком. Рассмотрим типовой пример использования этого оператора:
for(i=0;i
{
document.write(document.links[i].href+" ");
}
for(i=0;i");
}
Примеры подобного сорта разбросаны по всем разделам курса. Один из них расположен в разделе "Изменение картинки".
начало страницы
for ... in
Данный оператор позволяет "пробежаться" по свойствам объекта. Рассмотрим пример:
for(v in window.document)
{
document.write(v+" ");
}
Все свойства текущего объекта документ:
for(v in window.document)
{
document.write(v+":"+eval('document.'+v)+" ");
}
Данный документ состоит из нескольких разделов. Обращение "window.document" позволяет обратиться к общему документу, а не к отдельно взятому разделу. Поэтому распечатанные свойства - это свойства всего документа.
начало страницы
break
Оператор break позволяет досрочно покинуть тело цикла. Распечатаем только title документа:
for(v in window.document)
if(v=="title")
{
document.write(v+":"+eval('document.'+v)+" ");
break;
}
for(v in window.document)
if(v=="title")
{
document.write("Результат: ");
document.write(v+":"+eval('document.'+v)+" ");
break;
}
В пример распечатки свойств объекта document мы вставили break при просмотре свойства title и получили искомый результат.
начало страницы
continue
Тот же самый результат, что и при использовании break можно было бы достичь при помощи оператора continue:
for(v in window.document)
{
if(v!="title") continue;
document.write(v+":"+eval('document.'+v));
break;
}
for(v in window.document)
{
if(v!="title") continue;
document.write("Результат: ");
document.write(v+":"+eval('document.'+v)+" ");
break;
}
Этот оператор позволяет пропустить часть тела цикла (от оператора до конца тела) и перейти к новой итерации. Таким образом, мы просто пропускаем все свойства до title и после этого выходим из цикла.
начало страницы
Оператор return используют для возврата значения из функции или обработчика события(см. разделы "Поле статуса" "Обмен данными"). Рассмотрим пример:
В данном примере return используется для маскирования передачи данных на сервер.
Status
Поле статуса(строка статуса, status bar)
Поле статуса - это первое, что начали использовать авторы HTML-страниц из арсенала JavaScript. Калькуляторы, игры, математические вычисления, и т.п. упражнения выглядели слишком искусственно. На их фоне бегущая строка в поле статуса была настоящей изюминкой, которая могла действительно привлечь внимание пользователей к Web-узлу. Постепенно ее популярность сошла на нет. Бегущие строки стали редкостью, но программирование поля статуса встречается на многих Web-узлах.
Полем статуса(status bar) называют среднее поле нижней части окна браузера сразу под областью отображения HTML-страницы. В поле статуса отображается информация о состоянии работы браузера(загрузка документа, загрузка графики, завершение загрузки, запуск апплета и т.п.). Программа на JavaScript имеет возможность работать с этим поле как с изменяемым свойством окна. При этом фактически с этим полем связаны два разных свойства:
window.status
window.default.Status
Разница между ними заключается в том, что браузер на самом деле имеет несколько состояний, которые связаны с некоторыми событиями. Состояние браузера отражается сообщением в поле статуса. По большому счету, существует только два состояния: нет никаких событий (defaultStatus) и происходят какие-то события(status).
Программируем status
Свойство status связано с отображением сообщений о событиях, отличных от простой загрузки страницы. Например, когда мышь проходит над гипертекстовой ссылкой, то URL, указанный в атрибуте href, отображается в поле статуса. При попадании мыши на поле свободное от ссылок в поле статуса восстанавливается сообщение умолчания(Document:Done). Эта техника реализована на данной странице при переходе на описание свойств status и defaultStatus: window.status
В документации по JavaScript указано, что обработчик событий Mouseover и Mouseout должен возвращать значение true. Это нужно для того, чтобы браузер не выполнял действий по умолчанию. Проверка показывает, что Navigator 4.0 прекрасно обходится и без возврата значения true.
Другой пример программирования поля статуса - динамическое обновление значения этого поля. Например, отображение текущей даты и времени:
Если нажать на кнопку "Запустить Часы", то в поле статус будет отображаться текущее время. Если нажать на кнопку "Остановить Часы", то в поле статуса снова восстановится сообщение умолчания. Если начать двигать мышь в поле браузера по областям, в которых нет гипертекстовых ссылок, то время будет все время перекрываться сообщением умолчания, т.е. будет вместо свойства status отображаться свойство defaultStatus в поле статуса. Статус отображается только в момент запуска потока, который подготовлен к выполнению функцией setTimeout().
начало страницы
Программируем defaultStatus
Свойство defaultStatus определяет текст, отображаемый в поле статуса, когда никаких событий не происходит. В нашем документе мы определили его в момент загрузки документа:
Это сообщение появляется в момент, когда загружены все компоненты страницы (текст, графика, апплеты и т.п.). Оно восстанавливается в строке статуса после возврата из любого события, которое может произойти в момент просмотра документа. Любопытно, что движение мыши по свободному от гипертекстовых ссылок полю страницы приводит к постоянному отображению defaultStatus.
Submenu
Вложенные меню
При обсуждении программирования форм отмечено, что в HTML нет стандартного способа реализации вложенных меню. Тем не менее, за счет графики можно реализовать их подобие. При этом следует понимать, что место, на которое ложится графика, нельзя занять текстом:
В этом примере вложенное меню расположено справа от основного. Эффект вложенности достигается за счет изменения цвета. Подчиненность меню можно подчеркнуть изменением его положения относительно основного меню:
onMouseover="submenu1(1);return true;"
>
onMouseover="submenu1(2);return true;"
>
onMouseover="submenu1(3);return true;"
>
onMouseover="submenu1(3);return true;"
>
onMouseover="submenu1(3);return true;"
>
В этом случае для продвижения меню вниз необходимо зарезервировать место при помощи невидимых или видимых картинок. При этом это не обязательно иллюстративные картинки, которые не несут никакой нагрузки. На главной странице цикла "Web-инжиниринг" меню открывается прямо по существующим ссылкам, изменяя при этом их содержание. начало страницы
Submit
Обмен данными
Передача данных на сервер из формы происходит по событию submit. Это событие происходит при одном из следующих действий пользователя:
нажата кнопка Submit
нажата графическая кнопка
нажата клавиша Enter в форме из одного поля
вызван метод Submit
При описании отображения контейнера FORM на объекты JavaScript мы подробно описали обработку события submit. В данном разделе мы сосредоточимся на сочетании JavaScript-программ в атрибутах полей и обработчиках событий. Особое внимание уделим возможности перехвата/генерации события submit.
Кнопка Submit
Кнопка submit - это разновидность поля ввода. Она ведет себя так же, как и обычная кнопка, но только при этом генерирует событие submit(передачу данных на сервер). В этом, с точки зрения JavaScript-программирования, она абсолютно идентична графическим кнопкам:
В этом примере мы просто перезагружаем страницу.
С точки зрения программирования наибольший интерес представляет собой возможность перехвата события submit и выполнение при этом действий, отличных от стандартных. Для этой цели у кнопки есть атрибут обработки события click(onClick):
Из этого примера видно, что кнопка submit ведет себя несколько иначе, чем графическая кнопка в Netscape Navigator, но также как графическая кнопка в Internet Explorer(различия со временем наверняка исчезнут :-)). При нажатии на кнопку перезагрузки страницы не происходит - передача данных на сервер отменена. Обработчик работает так же, как и обработчик события submit в контейнере FORM.
Теперь можно написать свою собственную программу обработки события submit:
function my_submit()
{
if(window.confirm("Do you wona to reload page?")) return true;
else return false;
}
...
Если согласиться с перезагрузкой страницы, то она действительно будет перезагружена, при отказе (cancel) - вы вернетесь в текущую страницу без перезагрузки. Действия могут быть и более сложными. В любом случае, если функция обработки возвращает значение true, то передача данных на сервер(в нашем случае перезагрузка страницы) происходит, в противном случае (значение false) - данные не передаются.
начало страницы
Единственное поле в форме
Если в форме присутствует одно единственное поле, и мы в него осуществили ввод и после этого нажали на кнопку клавиатуры Enter, то браузер сгенерирует событие submit:
Перехватить такое событие и обработать можно только за счет программы обработки события submit в контейнере FORM, как это и сделано в примере.
Нужно что-то делать
Ничего не надо делать
В этом примере кроме поля ввода в форме присутствует меню. Если менять значения выбранных альтернатив, то перезагрузки не происходит, но стоит изменить значение в поле ввода и нажать Enter, происходит submit и мы получаем окно предупреждения.
начало страницы
Метод submit()
Метод submit() - это метод формы. Если в программе вызывается метод submit, то данные из формы, к которой применяется данный метод, передаются на сервер. Усовершенствуем пример с полем ввода и меню выбора(прежде чем выбирать альтернативы прочтите комментарий под примером):
Нужно что-то делатьНичего не надо делать
При выборе альтернативы пользователь сразу инициирует обмен данными с сервером. Событие submit в данном случае обработчиком событий не перехватывается в отличие от нажатия Enter. Такое поведение браузера довольно логично. Если программист вызвал метод submit(), то, наверное, он предварительно проверил данные, которые отправляет на сервер.
Table
Графика и таблицы
Одним из наиболее популярных приемов дизайна страниц Web-узла является техника нарезки картинок на составные части. Можно выделить следующие способы применения этой техники для организации навигационных компонентов страницы:
Горизонтальные и вертикальные меню
Вложенные меню
Навигационные графические блоки
Главной проблемой при использовании нарезанной графики является защита ее от контекстного форматирования страницы HTML-parser-ом. Дело в том, что он автоматически переносит элементы разметки на новую строку, если они не помещаются в одной строке. Нарезанная картинка требует совершенно определенного расположения своих составных частей, поэтому простое их перечисление в ряд не дает желаемого эффекта: ...
Элементы переносятся на новую строку, т.к. ширина раздела меньше общей ширины всех картинок. Проблема решается если применить защиту от parser-а -
:
...
Использование такого меню требует определения на нем гипертекстовых ссылок, что приводит к следующему эффекту:
...
Это можно решить за счет применения атрибута border равного 0:
...
Теперь попробуем тем же способом реализовать многострочное меню:
Сплошной картинки не получается, т.к. высота строки не равна высоте картинки. Подогнать эти параметры практически нельзя. Каждый пользователь настраивает браузер по своему вкусу. Решение заключается в использовании таблицы:
В данном случае все картинки удается сшить без пропусков и тем самым достичь непрерывности навигационного дерева. Пропуски устраняются путем применения атрибутов border, cellspacing и cellpadding. Первый устраняет границы между ячейками, второй устанавливает расстояние между ячейками равным 0 пикселей, третий устанавливает отступ между границей ячейки и элементом, помещенным в нее, равным 0 пикселей.
Taint
Модель безопасности
При программировании на JavaScript потенциально существует возможность доступа из программы к персональной информации пользователя. Эта проблема есть всегда, когда нечто запускается на компьютере и это нечто имеет возможность самостоятельно организовать обмен данными по сети с удаленным сервером.
От версии к версии управление защитой таких данных постоянно совершенствуется, но всегда нужно иметь в виду, что множество "следопытов" исследует эту проблему и постоянно открывает все новые и новые возможности обхода механизмов защиты.
Объясним только основные моменты в принципах защиты информации в JavaScript, а поиск потенциально слабых мест оставим в качестве домашнего задания для наиболее пытливых читателей.
По умолчанию к защищенным в JavaScript данным относятся:
Защищенными эти данные являются с той точки зрения, что не может получить значения соответствующих атрибутов. Главным образом речь здесь идет о программе, которая пытается получить доступ к данным, которые определены на другой странице, отличной от той, в рамках которой данная программа исполняется. Например, к данным из другого окна.
В настоящее время известно три модели защиты: запрет на доступ(Navigator 2.0), taint model (Navigator 3.0), защита через Java (Navigator 4.0). Рассмотрение этих моделей и приемы программирования - это отдельный сложный и трудоемкий вопрос, требующий знаний и навыков программирования на языке Java, поэтому в рамках данного курса мы его рассматривать не будем.
Отметим только, что к большинству свойств объектов текущей страницы и окна программист имеет доступ. Они становятся защищенными только в том случае, если относятся к документу в другом окне и загруженному из другого Web-узла. Поэтому ограничения, накладываемые системой безопасности JavaScript, достаточно гибкие и не очень сильно мешают разработке страниц с применением этого языка программирования.
Схема URL- "javascript:..."
Для программирования гипертекстовых переходов в спецификацию Универсального Идентификатора Ресурсов разработчики JavaScript ввели отдельную схему по аналогии со схемами http, ftp и т.п. - javascript. Эта схема URL упоминается в разделе "Размещение JavaScript-кода" в контексте передачи управления JavaScript-интерпретатору от HTML-parser-а. Кроме того, программирование гипертекстового перехода рассмотрено в разделе Обработка события Click. Теперь мы рассмотрим более общий случай обработки события гипертекстового перехода при выборе гипертекстовой ссылки.
Схема URL javascript в общем виде выглядит следующим образом: ...
Следует при этом заметить, что все-таки использование схемы javascript в этом месте HTML-разметки выглядит несколько "коряво". Для того чтобы все работало так, как предполагается автором, приходится использовать метод post. Гораздо логичнее выглядит применение обработчика события onSubmit.
nThis file was not retrieved
Wcontrol
Управление окнами
Что можно сделать с окном? - Открыть(создать), закрыть(удалить), положить его поверх всех других открытых окон(передать фокус). Кроме того, можно управлять свойствами окна и свойствами подчиненных ему объектов. Описанию основных свойств посвящены все странички раздела "Программируем свойства окна браузера", поэтому сосредоточимся на простых и наиболее популярных методах окна:
alert()
confirm()
prompt()
open()
close()
focus()
setTimeout()
clearTimeout()
Здесь не указаны только два метода: scroll() и blur().
Первый позволяет продернуть окно на определенную позицию. Но его очень сложно использовать, не зная координат окна. Последнее является обычным делом, если только не используется технология программирования слоев или pcss.
Второй метод уводит фокус с окна. При этом совершенно не понятно, куда этот фокус будет передан. Гораздо проще целенаправленно передать фоку, чем его просто потерять.
window.alert()
Метод alert() позволяет выдать окно предупреждения: Во дворе злая собака
Во дворе злая собака
Все очень просто, но нужно иметь в виду две вещи: во-первых, сообщения выводятся системным фонтом, следовательно, для предупреждений на русском языке нужна локализованная версия ОС, и, во-вторых, как это вообще принято в JavaScript, нельзя выдавать сообщения с буквой "я". Такие сообщения приводят к перманентной ошибке браузера. начало страницы
window.confirm
Метод confirm() позволяет задать пользователю вопрос, на который тот может ответить либо положительно, либо отрицательно:
Все ограничения для сообщений на русском языке, которые были описаны для метода alert() справедливы и для метода confirm().
начало страницы
window.prompt
Метод prompt() позволяет принять от пользователя короткую строку текста, которую он набирает в поле ввода информационного окна:
Введенную пользователем строчку можно присвоить любой переменной и потом ее разбирать в JavaScript-программе.
начало страницы
window.open
У этого метода окна атрибутов больше, чем у некоторых объектов. Метод предназначен для создания новых окон. В общем случае его синтаксис выглядит следующим образом:
URL - страница, которая будет загружена в новое окно,
window_name - имя окна, которое можно использовать в атрибуте target в контейнерах A и FORM,
params - список параметров:
параметрназначение
width
ширина окна в пикселях
height
высота окна в пикселях
toolbar
создает окно с системными кнопками браузера
location
создает окно с полем location
directories
создает окно с меню предпочтений пользователя
status
создает окно с полем статуса status
menubar
создает окно с меню
scrollbar
создает окно с линейками прокрутки
resizable
создает окно, размер которого можно будет изменять после создания
replace - позволяет при открытии окна управлять записью в массив history
Если вы не поленитесь и проверите все гипертекстовые ссылки в таблице параметров, то получите представление о работе каждого из них.
начало страницы
window.close
Метод close() - это оборотная сторона медали метода open(). Он позволяет закрыть окно. Наиболее часто встает вопрос о том, а которое из окон собственно следует закрыть. Если необходимо закрыть текущее окно, то:
window.close();
self.close();
Если необходимо закрыть родительское окно, т.е. окно, из которого было открыто текущее окно, то:
window.opener.close();
Если необходимо закрыть произвольное окно, то тогда сначала нужно получить его идентификатор,:
id=window.open();
...
id.close();
Как видно из последнего примера, закрывают окно не по имени(значение атрибута target тут совершенно не уместно), а используют указатель на объект.
начало страницы
windows.focus
Метод focus() применяется для передачи фокуса в окно, с которым он использован. Передача фокуса полезна как при открытии окна, так и при его закрытии, не говоря уже о случаях, когда нужно выбирать окна. Рассмотрим пример.
В нем откроем окно и, не закрывая его, снова откроем окно с таким же именем, но с другим текстом. Новое окно не появилось по верх основного окна, т.к. фокус ему не был передан. Теперь повторим открытие окна, но теперь с передачей фокуса:
function myfocus(a)
{
id = window.open("","example","scrollbars,width=300,height=200");
if(a==1)
{
id.document.open();
id.document.write("
Открыли окно в первый раз");
}
if(a==2)
{
id.document.open();
id.document.write("
Открыли окно во второй раз");
}
if(a==3)
{
id.focus();
id.document.open();
id.document.write("
Открыли окно во второй раз");
}
id.document.write("
");
id.document.close();
}
Поскольку мы пишем содержание нового окна из окна старого(родителя), то в качестве указателя на объект используем значение переменной id.
начало страницы
window.setTimeout
Метод setTimeout() используется для порождения нового потока вычислений, исполнение которого откладывается на время(ms), указанное вторым аргументом:
idt = setTimeout("JavaScript_код",Time);
Типовое применение этой функции - организация автоматического изменения свойств объектов. Например, можно запустить часы в поле формы:
Обратите внимание на то, что поток порождается в данном случае всегда, даже в том случае, когда часы стоят. Если бы его порождали только при значении переменной flag равном единице, то при значении 0 он исчез бы навсегда, и при нажатии на кнопку часы продолжали бы стоять.
начало страницы
window.clearTimeout()
Метод clearTimeout() позволяет уничтожить поток, порожденный методом setTimeout(). Очевидно, что его применение позволяет более рачительно использовать ресурсы вычислительной установки. Для того чтобы использовать этот метод в примере с часами, нам нужно модифицировать функции и форму:
В данном примере для остановки часов используется метод clearTimeout(). При этом, чтобы не порождалось множество потоков, проверяется значение указателя на объект потока.
Window
Программируем свойства окна браузера
Класс объектов Window - это самый старший класс в иерархии объектов JavaScript. К этому классу объектов относятся объект window и объект frame. Объект window ассоциируется с окном программы-браузера, а объект frame с окнами внутри окна браузера, которые порождаются последним при использовании автором HTML-страниц контейнеров FRAMESET и FRAME.
При программировании на JavaScript наиболее часто используют следующие свойства и методы объектов типа window:
СвойстваМетодыСобытия
status
location
history
navigator
open
close
focus
Событий нет
Объект window порождается только в момент открытия окна. Все остальные объекты, которые порождаются при загрузке страницы в окно, есть свойства объекта window. Таким образом, у window могут быть разные свойства при загрузке разных страниц.
Кузина И.А.,Храмцов П.Б. - Применение каскадных таблиц стилей
Конспект
Тесты
Зачет
Семинар
Литература
Отзывы
Страница регистрации участников зачета
Для сдачи зачета необходимо быть зарегистрированным участником тестирования. Для регистрации в качестве участника зачета заполните форму. Обязательными полями являются "Login:", "Password:", "Подтвердить Password:","E-mail:". Фамилию, имя и отчетство можите не указывать.
Login:
Password:
Подтвердите Password:
Фамилия:
Имя:
Отчетство:
E-mail:
[
Вернуться... ] [
Начать тестирование... ]
Результаты тестирования записываются в базу данных системы и высылаются по желанию участника тестирования по e-mail.
Зачет представляет из себя двадцать выбранных случайным образом вопросов из тех, что предсталены в разделе "Тесты". На выполнение зачета отводится 30 минут. Зачет сдан, если участник набирает 4/5 от максимального колличества баллов сгенерированного для него теста.
Кузина И.А.,Храмцов П.Б. - Применение каскадных таблиц стилей
Конспект
Тесты
Зачет
Семинар
Литература
Отзывы
Назначение CSS
1.
Какие проблемы HTML-разметки решают CSS?
точное позиционирование блока текста
типизация разметки HTML
разделение логической структуры документа и формы его представления
2.
Можно ли, используя CSS, полностью переопределить форму представления элемента HTML-разметки?
можно
нельзя
3.
Можно ли программировать стили на JavaScript?
можно
нельзя
полный контроль возможен только в IE 4.x и старше
определять стили в нотации JavaScript можно и в NN, и в IE, начиная с версий 4.х, изменить стиль после загрузки документа можно только в IE 4.x и старше.
function result() { var a="/control/read_db/csst?"; for(i=0;i
Ваша оценка:
Максимальный балл: 8.
далее...
Кузина И.А.,Храмцов П.Б. - Применение каскадных таблиц стилей
Конспект
Тесты
Зачет
Зачет
Семинар
Литература
Отзывы
Зачет по курсу CSS
Для сдачи зачета необходимо быть зарегистрированным участником тестирования. Если Вы уже зарегистрировались, то введите в поле "Login:" свой идентификатор, а в поле "Password:" свой пароль после этого выберите ссылку "Начать тестирование...".
Если Вы в первый раз решили принять участие в тестировании, то перейдите к странице регистрации по ссылке "Регистрация...". После регистрации вы немедленно получите возможность выполнить тест.
Login:
Password:
[
Регистрация... ] [
Начать тестирование... ]
Результаты тестирования записываются в базу данных системы и высылаются по желанию участника тестирования по e-mail.
Зачет представляет из себя двадцать выбранных случайным образом вопросов из тех, что предсталены в разделе "Тесты". На выполнение зачета отводится 30 минут. Зачет сдан успешно, если участник набирает 4/5 от максимального колличества баллов сгенерированного для него теста.
Кузина И.А.,Храмцов П.Б. - Применение каскадных таблиц стилей
Конспект
Тесты
Зачет
Семинар
Литература
Отзывы
Свойства текста
1.
Какие из перечисленных атрибутов определяют свойства текста?
font-size
text-align
line-height
color
text-transform
letter-spacing
2.
В чем отличие свойств описания шрифта от свойств описания текста?
отличий нет
свойства текста относятся ко всему элементу, а свойства шрифта только к его части
Свойcтва шрифта определяют начертание букв, а свойства текста их взаимное расположение внутри элемента разметки
3.
В чем отличие свойств описания блоков текста от свойств описания текста?
свойства описания блоков текста относятся только к блочным элементам разметки, а свойства текста как к блочным, так и к строчным элементам разметки
свойства блоков текста определяют свойства блока как целого, в то время как свойства текста определяют взаимное расположение букв и слов внутри блока текста
между этими свойствами нет разницы
function result() { var a="/control/read_db/csst?"; for(i=0;i
Ваша оценка:
Максимальный балл: 11.
далее...