Вход/Регистрация
JavaScript. Подробное руководство, 6-е издание
вернуться

Флэнаган Дэвид

Шрифт:

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

var і = 3;

Это переменная представляет собой свойство глобального объекта, т. е. свойство объекта

Window
. Сценарий во фрейме А может явно сослаться на эту переменную как на свойство с помощью объекта
window
:

window.і

Благодаря тому что сценарий во фрейме В может ссылаться на объект

Window
во фрейме А, он также может ссылаться на свойства этого объекта окна:

parent.А.і = 4; // Изменит значение переменной во фрейме А

Напомню, что ключевое слово

function
, определяющее функцию, объявляет переменную так же, как ключевое слово
var
. Если JavaScript-код во фрейме В объявляет функцию
f
, эта функция станет глобальной переменной во фрейме В, и сценарий во фрейме В сможет вызывать функцию
f
как
f
. Однако сценарий во фрейме А должен ссылаться на
f
как на свойство объекта
Window
во фрейме В:

parent.В.f;

Если сценарий во фрейме А часто вызывает эту функцию, ее можно присвоить переменной во фрейме А, чтобы было удобнее ссылаться на функцию:

var f = parent.В.f;

Теперь сценарий во фрейме А сможет вызывать функцию как

f
точно так же, как сценарий во фрейме В.

Разделяя подобным образом функции между фреймами или окнами, очень важно помнить о правилах лексического контекста. Функции выполняются в том контексте, в котором они определены, а не в том, из которого они вызываются. Следовательно, если функция

f
ссылается на глобальные переменные, поиск этих переменных выполняется в свойствах фрейма В, даже когда функция вызывается из фрейма А.

Напомню, что конструкторы - это тоже функции, поэтому когда вы определяете класс объектов (см. главу 9) с функцией-конструктором и связанным с ним объектом-прототипом, этот класс будет определен только для одного окна. Предположим, что окно, содержащее фреймы А и В, включает класс

Set
из примера 9.6.

Сценарии в окне верхнего уровня смогут создавать новые объекты

Set
, как показано ниже:

var s = new Set;

  • Читать дальше
  • 1
  • ...
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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