Указывать четвертый аргумент
<b>open()</b>
имеет смысл, только если второй аргумент определяет имя существующего окна. Этот аргумент - логическое значение, определяющее, должен ли URL-адрес, указанный в первом аргументе, заменить текущую запись в истории просмотра окна (
<b>true</b>
) или требуется создать новую запись (
<b>false</b>
). Если этот аргумент опущен, используется значение по умолчанию
<b>false</b>
.
Значение, возвращаемое методом
<b>open(),</b>
является объектом Window, представляющим вновь созданное окно. Этот объект позволяет сослаться в JavaScript-коде на новое окно так же, как исходный объект
<b>Window</b>
ссылается на окно, в котором выполняется сценарий:
<b>var w = window.open(); // Открыть новое пустое окно</b>
<b>w.alert("Будет открыт сайт </b><a href="http://example.com/"><b>http://example.com</b></a><b>"); // Вызвать его метод alert() </b>
<b>w.location = "</b><a href="http://example.com/"><b>http://example.com</b></a><b>"; // Установить св-во location</b>
В окнах, созданных методом
<b>window.open(),</b>
свойство
<b>opener</b>
ссылается на объект
<b>Window</b>
сценария, открывшего его. В других случаях свойство opener получает значение
<b>null</b>
:
<b>w.opener !== null; // Верно для любого окна w, созданного методом open() </b>
<b>w.open().opener === w; // Верно для любого окна w</b>
Метод
<b>Window.open()</b>
часто используется рекламодателями для создания «всплывающих окон» с рекламой, когда пользователь путешествует по Всемирной паутине. Такие всплывающие окна могут раздражать пользователя, поэтому большинство веб-броузеров реализуют механизм блокирования всплывающих окон. Обычно вызов метода
<b>open()</b>
преуспевает, только если он производится в ответ на действия пользователя, такие как щелчок мышью на кнопке или на ссылке. Попытка открыть всплывающее окно, которая производится, когда броузер просто загружает (или выгружает) страницу, обычно оканчивается неудачей. Попытка протестировать представленные выше строки программного кода в консоли JavaScript вашего броузера также может окончиться неудачей по тем же причинам.
14.8.1.1. Закрытие окон
Новое окно открывается при помощи метода
<b>open()</b>
и закрывается при помощи метода
<b>close().</b>
Если объект Window был создан сценарием, то этот же сценарий сможет закрыть его следующей инструкцией:
<b>w.close();</b>
JavaScript-код, выполняющийся внутри данного окна, может закрыть его так:
<b>window.close();</b>
Обратите внимание на явное использование идентификатора
<b>window</b>
для устранения неоднозначности между методом
<b>close()</b>
объекта
<b>Window</b>
и методом
<b>close()</b>
объекта
<b>Document</b>
- это важно, если метод
<b>close()</b>
вызывается внутри обработчика события.
Большинство броузеров разрешают программисту автоматически закрывать только те окна, которые были созданы его собственным JavaScript-кодом. Если сценарий попытается закрыть любое другое окно, появится диалоговое окно с запросом к пользователю подтвердить (или отменить) закрытие окна. Вызов метода
<b>close()</b>
объекта
<b>Window</b>
, представляющего фрейм, а не окно верхнего уровня или вкладку, не выполняет никаких действий: нельзя закрыть фрейм (можно только удалить элемент
<b><iframe></b>
из содержащего его документа).
Объект
<b>Window</b>
продолжает существовать и после закрытия представляемого им окна. Однако не следует использовать какие-либо его свойства или методы, исключая проверку свойства
<b>closed</b>
. Если окно было закрыто, это свойство будет иметь значение
<b>true</b>
, свойство document - значение
<b>null</b>
, а методы окна обычно не выполняются.
14.8.2. Отношения между фреймами
Мы уже видели, что метод
<b>open()</b>
объекта
<b>Window</b>
возвращает новый объект
<b>Window</b>
, свойство
<b>opener</b>
которого ссылается на первоначальное окно. Таким образом, два окна могут ссылаться друг на друга, и каждое из них может читать свойства и вызывать методы другого. То же самое возможно для фреймов. Сценарий, выполняющийся в окне или фрейме, может ссылаться на объемлющее или вложенное окно или фрейм при помощи свойств, описываемых ниже.
Как вы уже знаете, сценарий в любом окне или фрейме может сослаться на собственное окно или фрейм с помощью свойства
<b>window</b>
или
<b>self</b>
. Фрейм может сослаться на объект Window вмещающего окна или фрейма с помощью свойства
<b>parent</b>
:
<b>parent.history.back();</b>
Объект
<b>Window</b>
, представляющий окно верхнего уровня или вкладку, не имеет вмещающего окна, поэтому его свойство parent просто ссылается на само окно:
<b>parent == self; // Для любых окон верхнего уровня</b>
Если фрейм находится внутри другого фрейма, содержащегося в окне верхнего уровня, то он может сослаться на окно верхнего уровня так:
<b>parent.parent</b>
. Однако в качестве универсального сокращения имеется свойство
<b>top</b>
: независимо от глубины вложенности фрейма его свойство
<b>top</b>
ссылается на содержащее его окно самого верхнего уровня. Если объект
<b>Window</b>
представляет окно верхнего уровня, свойство
<b>top</b>
просто ссылается на само окно. Для фреймов, непосредственно принадлежащих окну верхнего уровня, значение свойства
<b>top</b>
совпадает со значением свойства
<b>parent</b>
.