Мы уже видели, что метод open() объекта Window возвращает новый объект Window, представляющий только что созданное окно. Также мы видели, что это новое ок_ но имеет свойство opener, ссылающееся на первоначальное окно. Так два окна могут ссылаться друг на друга, и каждое из них может читать свойства и вызы_ вать методы другого. То же самое возможно для фреймов. Любой фрейм в окне может ссылаться на любой другой фрейм при помощи свойств frames, parent и top объекта Window.
JavaScript_код в любом окне или фрейме может сослаться на собственное окно или фрейм с помощью свойств window или self. Поскольку каждое окно или фрейм – это глобальный объект для содержащегося в них программного кода, совершенно не обязательно использовать свойство window или self для ссылки на сам глобальный объект. То есть если требуется сослаться на метод или свойство глобального объекта (хотя из соображений стилевого оформления это может
1 На ранних этапах развития JavaScript веб_приложения с множеством фреймов и окон были обычным явлением. Ныне в соответствии с общепринятыми принци_ пами веб_дизайна фреймы использовать не рекомендуется (это не относится к пла' вающим фреймам, которые называются iframes), благодаря чему все реже можновстретить веб_сайты, где присутствуют взаимодействующие друг с другом окна.
14.8. Работа с несколькими окнами и фреймами
быть полезно), использовать префикс window или self при обращении к методам или свойствам глобального объекта не обязательно.
Любое окно имеет свойство frames. Это свойство ссылается на массив объектов Window, каждый из которых представляет содержащийся внутри окна фрейм. (Если окно не содержит фреймов, массив frames[] пуст, и значение frames.length равно нулю.) Следовательно, окно (или фрейм) может ссылаться на свой первый подфрейм как на элемент frames[0], на второй подфрейм – как на элемент frames[1] и т. д. Аналогично JavaScript_код, работающий в окне, может следую_ щим образом ссылаться на третий подфрейм второго фрейма этого окна:
frames[1].frames[2]
Каждое окно имеет также свойство parent, ссылающееся на объект Window, в кото_ ром это окно содержится. Следовательно, первый фрейм в окне может сослаться на смежный с ним фрейм (второй фрейм того же окна) так:
parent.frames[1]
Если окно является окном верхнего уровня, а не фреймом, свойство parent про_ сто ссылается на само окно:
parent == self; // Для любого окна верхнего уровня
Если фрейм находится внутри другого фрейма, содержащегося в окне верхнего уровня, то он может сослаться на окно верхнего уровня так: parent.parent. Одна_ ко в качестве универсального сокращения имеется свойство top: независимо от глубины вложенности фрейма его свойство top ссылается на содержащее его ок_ но самого верхнего уровня. Если объект Window представляет окно верхнего уров_ ня, top просто ссылается на само окно. Для фреймов, непосредственно принадле_ жащих окну верхнего уровня, свойство top совпадает со свойством parent.
Фреймы обычно создаются с помощью тегов <frameset> и <frame>. Однако в HTML 4 может также использоваться тег <iframe>, создающий в документе плавающий фрейм. Для JavaScript фреймы, созданные с помощью тега <iframe>, – это то же самое, что фреймы, созданные с помощью тегов <frameset> и <frame>. Все, о чем говорилось ранее, применимо к обоим видам фреймов.
Рисунок 14.3 иллюстрирует эти отношения между фреймами и показывает, как код, работающий в одном фрейме, может ссылаться на любой другой фрейм по_ средством свойств frames, parent и top. Здесь окно броузера содержит два фрейма – один над другим. Второй фрейм (больший, он расположен снизу) сам содержит три подфрейма, расположенных бок о бок.