Фреймы - это несколько видоизмененные окна. Отличаются они от полноценных окон тем, что размещаются внутри последних. У фрейма не может быть ни панели инструментов, ни меню, которые присущи обычному окну. Фрейм использует в качестве поля статуса поле статуса окна, в котором он размещен. Существует и ряд других отличий.
Сосредоточим наше внимание на:
Естественно, что иерархия определяет и правила именования фреймов, и способы передачи фокуса фрейму.
Иерархия фреймов
Рассмотрим сначала простой пример: разделим экран на две вертикальные колонки:
_top(_parent)
left | right |
---|
Слова "_top" и "_parent" появились в этом контексте не случайно. Это имена окна, в которое помещают фреймы. Графически это можно изобразить как:
_top (_parent) |
![]() |
![]() |
Усложним пример: разобьем правый фрейм на два по горизонтали:
_top(_parent)
left | top |
---|---|
bottom |
Обратите внимание на два момента: во-первых, следует различать _top и top, во-вторых, исчез фрейм right. По поводу первого замечания: _top - это зарезервированное имя старшего окна, а top - имя фрейма, которое назначил ему автор страницы. По поводу второго замечания: старшим окном для всех фреймов является все окно браузера, фрейма с именем right в данном случае не существует:
_top (_parent) |
![]() |
![]() |
![]() |
Для того чтобы он появился нужно свести оба наших примера в один. Это значит, что во фрейм right мы должны загрузить снова фреймовый документ:
В этом случае подчинение страниц будет выглядеть иначе, чем в примере с тремя фреймами:
_top (_parent для left и right) |
![]() |
![]() |
![]() ![]() |
![]() ![]() |
Таким образом, мы получили тот же результат, что и с тремя фреймами и одним старшим окном. Однако, этот вариант гибче. Он позволяет использовать фрейм, содержащий горизонтальную разбивку. Именно такой прием используется на домашней странице "Web-инжиниринг".
Такая интерпретация фреймовой структуры страницы получает отражение и при именовании фреймов JavaScript.
Именование фреймов
Обратиться к фрейму можно либо по имени, либо как к элементу массива frames[]. Рассмотрим HTML-документ:
Предположим, что на странице, загруженной в правый фрейм, есть две картинки. Для изменения свойства src второй из них можно использовать следующие записи:
Проиллюстрируем это следующим примером: сначала откроем окно примера (кнопка "Открыть окно примера"), затем изменим картинку "рыбка" на картинку "жираф", нажав на кнопку "Заменим рыбку на жирафа по индексу", потом произведем обратную замену по кнопке "Заменим жирафа на рыбку по имени".
Прежде, чем нажимать на кнопки замены картинок, следует открыть окно примера. В противном случае получите ошибку JavaScript.
В связи с индексированием фреймов возникает вопрос о том, как они нумеруются в одномерном встроенном массиве фреймов объекта Window. Проиллюстрируем это на примере:
frame[0] (top) | ||
---|---|---|
frame[1](left) | frame[2](center) | frame[3](right) | frame[4] (bottom) |
Построим теперь нечто перпендикулярное предыдущему примеру:
frame[0] (left) | frame[1](top) | frame[4] (right) |
---|---|---|
frame[2](center) | ||
frame[3](bottom) |
Таким образом, при нумеровании фреймов в одномерном массиве фреймов на странице система придерживается правила "слева-направо, сверху-вниз". Вкладывая наши примеры друг в друга, легко можно получить правильную индексацию страниц при любой сложной фреймовой структуре.
Передача фокуса во фрейм
Обычной задачей при разработке типового Web-узла является задача загрузки результатов исполнения cgi-скрипта во фрейм отличный от фрейма, в котором вводятся данные для этого скрипта. Если путь загрузки результатов фиксирован, то можно просто использовать атрибут target формы, и на этом закончить раздумья над этой проблемой. Сложнее, если результат работы должен быть загружен в разные фреймы, в зависимости от выбранной кнопки, например.
Для решения этой задачи можно использовать два разных пути: открывать открытое окно и переназначать свойство target. Последнее, конечно более изящное решение, поэтому с него и начнем:
Функция load() вызывается как обработчик события Submit. По этой причине она является логической функцией. Возврат значения true позволяет реализовать перезагрузку документа.
Теперь рассмотрим второй вариант. Его идея состоит в том, что при открытии окна с именем существующего окна новое окно не открывается, а используется уже открытое окно. Фрейм - это тоже окно, поэтому для него это правило остается справедливым, но вот функция, которая реализует этот вариант, отличается от предыдущей:
Обратите внимание на то, что данная функция возвращает значение false. Это происходит потому, что надо маскировать событие Submit. Ведь документ уже перезагружен и его снова загружать не надо.