Чтение онлайн

на главную - закладки

Жанры

JavaScript. Подробное руководство, 6-е издание
Шрифт:

Мы уже видели, что метод

open
объекта
Window
возвращает новый объект
Window
, свойство
opener
которого ссылается на первоначальное окно. Таким образом, два окна могут ссылаться друг на друга, и каждое из них может читать свойства и вызывать методы другого. То же самое возможно для фреймов. Сценарий, выполняющийся в окне или фрейме, может ссылаться на объемлющее или вложенное окно или фрейм при помощи свойств, описываемых ниже.

Как вы уже знаете, сценарий в любом окне или фрейме может сослаться на собственное окно или фрейм с помощью свойства

window
или
self
. Фрейм может сослаться на объект Window вмещающего окна или фрейма с помощью свойства
parent
:

parent.history.back;

Объект

Window
, представляющий окно верхнего уровня или вкладку, не имеет вмещающего окна, поэтому его свойство parent просто ссылается на само окно:

parent == self; // Для любых окон верхнего уровня

Если фрейм находится внутри другого фрейма, содержащегося в окне верхнего уровня, то он может сослаться на окно верхнего уровня так:

parent.parent
. Однако в качестве универсального сокращения имеется свойство
top
: независимо от глубины вложенности фрейма его свойство
top
ссылается на содержащее его окно самого верхнего уровня. Если объект
Window
представляет окно верхнего уровня, свойство
top
просто ссылается на само окно. Для фреймов, непосредственно принадлежащих окну верхнего уровня, значение свойства
top
совпадает со значением свойства
parent
.

Свойства

parent
и
top
позволяют сценариям ссылаться на родительские окна или фреймы. Существует несколько способов сослаться на дочерние окна или фреймы. Фреймы создаются с помощью элементов
<iframe>.
Получить ссылку на объект
Element
, представляющий элемент
<iframe>,
можно точно так же, как на объект, представляющий любой другой элемент. Допустим, что документ содержит тег
<iframe id="f1">.
Тогда получить ссылку на объект
Element
, представляющий этот элемент
iframe
можно следующим образом:

var iframeElement = document.getElementById("f1");

Элементы

<iframe>
имеют свойство
contentWindow
, которое ссылается на объект
Window
фрейма, поэтому ссылку на объект
Window
этого фрейма можно получить так:

var childFrame = document.getElementByld("fl").contentWindow;

Имеется возможность пойти обратным путем - от объекта

Window
, представляющего фрейм, к объекту
Element
элемента
<iframe>,
содержащего фрейм, - с помощью свойства
frameElement
объекта
Window
. Объекты
Window
, представляющие окна верхнего уровня, а не фреймы, имеют значение
null
в свойстве
frameElement
:

var elt = document.getElementByld('fl');

var win = elt.contentWindow;

win.frameElement === elt // Всегда верно для фреймов

window.frameElement === null // Для окон верхнего уровня

Однако, чтобы получить ссылки на дочерние фреймы, обычно не требуется использовать метод

getElementByld
и свойство
contentWindow
. Каждый объект
Window
имеет свойство
frames
, хранящее ссылки на дочерние фреймы, содержащиеся в окне или фрейме. Свойство
frames
ссылается на объект, подобный массиву, который может индексироваться числовыми индексами или именами фреймов. Получить ссылку на первый дочерний фрейм в окне можно с помощью выражения
frames[0].
Сослаться на третий дочерний фрейм во втором дочернем фрейме можно с помощью выражения
frames[1].frames[2].
Сценарий, выполняющийся во фрейме, может сослаться на соседний фрейм одного с ним уровня, как
parent.frames[1].
Обратите внимание, что элементами массива
frames[]
являются объекты Window, а не элементы
<iframe>
.

Если в элементе

<iframe>
указать атрибут name или
id
, в качестве индекса этого фрейма можно будет использовать не только число, но и имя. Например, ссылку на фрейм с именем «И» можно получить с помощью выражения
frames["f1"]
или
frames.f1
.

В разделе 14.7 говорилось, что имена или идентификаторы элементов

<iframe>
и других автоматически превращаются в свойства объекта
Window
и что элементы
<iframe>
интерпретируются иначе, чем другие элементы: в случае с фреймами значениями этих автоматически создаваемых свойств становятся ссылки на объекты
Window
, а не на объекты
Element
. Это означает, что на фрейм с именем "f1" можно сослаться как на свойство
f1
вместо
frames.f1
. В действительности, стандарт HTML5 указывает, что свойство
frames
, подобно свойствам
window
и
self
, ссылается на сам объект
Window
, который действует как массив фреймов. Это означает, что на первый дочерний фрейм можно сослаться, как
window[0],
а получить количество фреймов можно, обратившись к свойству
window.length
или просто
length
. Однако использование свойства
frames
вместо
window
в подобных случаях делает программный код более понятным. Обратите внимание, что не во всех текущих броузерах выполняется условие
frame==window
, но даже в броузерах, где это условие не выполняется, разрешается индексировать дочерние фреймы числами и именами, обращаясь к любому из этих двух объектов.

С помощью атрибута

name
или
id
элементу
<iframe>
можно присвоить имя, которое будет доступно для использования в JavaScript-коде. Однако если использовать атрибут
name
, указанное имя также будет использоваться в качестве значения свойства
name
объекта
Window
, представляющего фрейм. Имя, указанное таким способом, можно использовать в качестве значения атрибута
target
ссылки и передавать методу
window.open
во втором аргументе.

14.8.3. JavaScript во взаимодействующих окнах

Для каждого окна или фрейма имеется свой собственный объект

Window
, определяющий независимый контекст выполнения JavaScript-кода. Но если сценарий в одном окне или фрейме может сослаться на другое окно или фрейм (и если политика общего происхождения не препятствует этому), сценарий в одном окне или фрейме может взаимодействовать со сценарием в другом окне или фрейме.

Представим себе веб-страницу с двумя элементами

<iframe>
, с именами «А» и «В», и предположим, что эти фреймы содержат документы, полученные с одного и того же сервера, и эти документы содержат взаимодействующие сценарии. Сценарий во фрейме А определяет переменную і:

Поделиться:
Популярные книги

Технарь

Муравьёв Константин Николаевич
1. Технарь
Фантастика:
космическая фантастика
попаданцы
7.13
рейтинг книги
Технарь

Кодекс Охотника. Книга XII

Винокуров Юрий
12. Кодекс Охотника
Фантастика:
боевая фантастика
городское фэнтези
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XII

Эволюционер из трущоб. Том 12

Панарин Антон
12. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Эволюционер из трущоб. Том 12

Дважды одаренный. Том V

Тарс Элиан
5. Дважды одаренный
Фантастика:
аниме
альтернативная история
городское фэнтези
5.00
рейтинг книги
Дважды одаренный. Том V

Волкодав

Семёнова Мария Васильевна
1. Волкодав
Фантастика:
фэнтези
героическая фантастика
9.46
рейтинг книги
Волкодав

Кодекс Охотника. Книга XXXV

Винокуров Юрий
35. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXXV

Газлайтер. Том 17

Володин Григорий Григорьевич
17. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 17

"Искажающие реальность" Компиляция. Книги 1-14

Атаманов Михаил Александрович
Искажающие реальность
Фантастика:
боевая фантастика
космическая фантастика
киберпанк
рпг
5.00
рейтинг книги
Искажающие реальность Компиляция. Книги 1-14

Бастард Императора. Том 2

Орлов Андрей Юрьевич
2. Бастард Императора
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бастард Императора. Том 2

Новые горизонты

Лисина Александра
5. Гибрид
Фантастика:
попаданцы
технофэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Новые горизонты

Купеческая дочь замуж не желает

Шах Ольга
Фантастика:
фэнтези
6.89
рейтинг книги
Купеческая дочь замуж не желает

Хозяева Острога

Брайдер Юрий Михайлович
3. Тропа
Фантастика:
научная фантастика
6.57
рейтинг книги
Хозяева Острога

Ботаник

Щепетнов Евгений Владимирович
1. Ботаник
Фантастика:
фэнтези
боевая фантастика
4.56
рейтинг книги
Ботаник

Метатель. Книга 2

Тарасов Ник
2. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель. Книга 2