Глаза страшат, а руки делают

ЧАСТЬ ВТОРАЯ


17. Объект Window (дополнение)
псевдонимы окна

  • что такое псевдонимы;
  • parent;
  • self;
  • top.

Как уже упоминалось в 12-м уроке, parent, self, top и frames — это не самостоятельные объекты, а «псевдонимы» объекта window. Попытаемся разобраться, зачем они нужны и в каких случаях их следует применять.

Здесь есть один запутывающий момент. От языка программирования мы вправе ожидать чёткой иерархической логики. В принципе она в JavaScript есть, но в данном случае немного «плывёт».

Объекты или свойства?

Эти «псевдонимы» называют также синонимами и свойствами объекта window.

Наверно, «синонимы» — это не совсем верно. Синоним подразумевает абсолютную заменяемость. А у этих значений всё же есть свои нюансы.

Что касается определения их как свойств...

В том же 12-м уроке я упоминал про свойства объекта document, которые сами также являются объектами. Кстати, сам объект document — это свойство объекта window. Вообще все дочерние объекты являются также и свойствами своих «родителей».

Таким образом, например, объект location является свойством window, и обращение window.location правильно (хотя window мы имеем право опускать).

Так являются ли наши псевдонимы дочерними объектами window?

Оба следующих выражения правильны (в квадратных скобках — необязательная часть):

[window].location
[window].self.location

Если считать self дочерним объектом, то в первом случае location — «дочка» window, во втором — «внучка».

Вот такая маленькая неувязочка иерархии. Вопрос остаётся открытым.

Это нарушение «жёсткой» логики объяснимо. Псевдонимы используются главным образом при обращении к окнам с фреймами. А в ситуации с фреймами в самом браузере происходит «нарушение субординации».

Структура «обычного» окна: окноБраузера — документ.

Структура окна с фреймом: окноБраузера — окноФрейма — документ.

«Третий лишний» налицо.

Впрочем, наше дело — не теоретизировать по этому поводу (хотя это тоже любопытно), а заставить их правильно работать.

Псевдоним parent

Этим псевдонимом обозначается окно, содержащее набор фрэймов frameset. Его употребление имеет смысл только при наличии фреймов.

Псевдоним parent ссылается на тэг <frameset> окна фрейма. Дочерние фреймы в данном <frameset> ссылаются на родственные фреймы (своих «братьев и сестёр») через parent вместо имени окна одним из следующих способов:

parent.frameName [или .frameID]

frameName — значение атрибута name соответствующего тэга <frame>,

frameID — значение атрибута id соответствующего тэга <frame>.

Эти атрибуты в данной конструкции взаимозаменяемы. В выражении используются без кавычек!

parent.frames[index]

index — порядковый номер фрейма в коллекции frames.

Номера отсчитываются по порядку появления в HTML-коде, начиная с 0.

parent.frames("frameName") [или ("frameID")]

В этом выражении значение атрибута name или атрибута id обязательно ставится в кавычки.

Последний способ не работает в Netscape и Mozilla

Если тэг <frameset> вложен в дочерний фрэйм, к нему нужно обращаться через parent.parent.

Например, у нас есть файл index.html с фреймами:

<html>
<head>
<title>Тест на фреймы</title>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1251">
</head>
<frameset cols="100,*">
<frameset rows="100,*">
<frame src="fr1.html" name="fr1" id="fr1">
<frame src="fr2.html" name="fr2" id="fr2">
</frameset>
<frame src="fr3.html" name="fr3" id="fr3">
</frameset>
</html>

Фрейм fr3.html в свою очередь также является контейнером фреймов:

<html>
<head>
<title>Внутренние фреймы</title>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1251">
</head>
<frameset cols="100,*">
<frameset rows="100,*">
<frame src="fr4.html" name="fr4" id="fr4">
<frame src="fr5.html" name="fr5" id="fr5">
</frameset>
<frame src="fr6.html" name="fr6" id="fr6">
</frameset>
</html>

Чтобы со страницы fr5.html, которая лежит во вложенном frameset, вызвать страницу fr6.html, которая находится в том же <frameset>, достаточно обратиться к «родителю» — parent. (fr6.html — третий фрейм в коде, следовательно, его порядковый номер — 2, так как первый — 0.)

<html>
<head>
<script type="text/javascript">
function getParentFrameIndex() {
/* Обращаемся 2 способом */
parent.frames[2].location.href="fr7.html"
}
</script>
</head>
<body>
<form action="">
<input type="button" value="frames[2]" onClick="getParentFrameIndex();">
</form>
</body>
</html>

Если с той же fr5.html мы захотим обратиться к странице fr2.html, которая лежит во <frameset> уровнем выше, то обращаемся к «дедушке»:

<html>
<head>
<script type="text/javascript">
function getGrandParentName() {
/* Обращаемся 1 способом */
parent.parent.fr2.location.href="fr8.html"
}
</script>
</head>
<body>
<form action="">
<input type="button" value="fr2" onClick="getGrandParentName();">
</form>
</body>
</html>

Коллекция frames

С этой коллекцией мы только что встретились в примере. Это набор тэгов <frame>, заключённых во <frameset>. Ещё раз напоминаю, что «нумерация вагонов» начинается с «локомотива» — то есть, с «нулевого вагона».

При обращении к фреймам из родительского окна достаточно написать:

frames[index].document.свойствоДокумента

Как обращаться к фреймам из самих фреймов, мы уже знаем.

Псевдоним self

Этим псевдонимом окно обращается к самому себе. В принципе, точно так же можно обращаться и через window. Зачем нужен этот псевдоним? В общем-то языку JavaScript он и не нужен. Просто если это окно сидит во фрейме, то живой человек-программист может засомневаться, что за window имеется в виду. Так вот, чтобы он не сомневался, себя, любимое, окно будет обзывать self.

Псевдоним top

А под этим псевдонимом подразумевается самое верхнее окно, то есть окно браузера.

Например, у нас открыта страница с фреймами. И в одном из фреймов есть кнопка, которая должна открыть новую страницу просто в браузере, без фреймов. Тогда делаем так:

<html>
<head>
<script type="text/javascript">
function openOnTop() {
top.location.href="fr7.html"
}
</script>
</head>
<body>
<form action="">
<input type="button" value="on top" onClick="openOnTop();">
</form>
</body>
</html>

Напоследок

Итак, мы изучили window — объект верхнего уровня в иерархии объектов браузера.

Весь же DOM, который построил Джек, можно схематически представить так:

[window]. псевдоним[если нужен]. document. элементДокумента. атрибутЭлементаДокумента = "значениеАтрибутаЭлементаДокумента"

document — HTML-код страницы, открытой в браузере.

элементДокумента — тэг из этого кода.

атрибутЭлементаДокумента — атрибут тэга (предположим, align).

"значениеАтрибутаЭлементаДокумента" — конкретное значение (допустим, "left").

Конктреные значения являются уже не свойствами, а параметрами, теми условиями, в которых абстрактный код начинает конкретно работать... Или не начинает... такое постоянно случается.

А вот чтобы вы смогли понять, почему не работает, я и пичкаю вас всякой теорией.


Итак, мы узнали:

как и зачем можно использовать псевдонимы окон

и вообще почти всё об окнах.


К следующему уроку >>


 010007