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

14.8.1. Открытие и закрытие окон

14.8.1. Открытие и закрытие окон

Открыть новое окно веб-броузера (или вкладку, что обычно зависит от настроек броузера) можно с помощью метода open() объекта Window. Метод Window.ореn() загружает документ по указанному URL-адресу в новое или в существующее окно и возвращает объект Window, представляющий это окно. Он принимает четыре необязательных аргумента:

Первый аргумент ореn() - это URL-адрес документа, отображаемого в новом окне. Если этот аргумент отсутствует (либо является пустой строкой), будет открыт специальный URL пустой страницы about:blank.

Второй аргумент ореn() - это строка с именем окна. Если окно с указанным именем уже существует (и сценарию разрешено просматривать содержимое этого окна), используется это существующее окно. Иначе создается новое окно и ему присваивается указанное имя. Если этот аргумент опущен, будет использовано специальное имя "_blank", т. е. будет открыто новое неименованное окно.

Обратите внимание, что сценарии не могут просто так указывать имена окон и не могут получать контроль над окнами, используемыми другими веб-приложения-ми: они могут указывать имена только тех существующих окон, которыми им «разрешено управлять» (термин взят из спецификации HTML5). Проще говоря, сценарий может указать имя существующего окна, только если это окно содержит документ, происходящий из того же источника, или если это окно было открыто самим сценарием (или рекурсивно открытым окном, которое открыло это окно). Кроме того, если одно окно является фреймом, вложенным в другое окно, сценарии в любом из них получают возможность управлять другим окном. В этом случае можно использовать зарезервированные имена «_top» (для обозначения вмещающего окна верхнего уровня) и «_parent» (для обозначения ближайшего вмещающего окна).

Имена окон

Имя окна играет важную роль, потому что оно позволяет указать существующее окно в вызове метода open(), а также потому, что оно может использоваться как значение HTML-атрибута target элементов <а> и <form>, ссылающихся на документ (или результат обработки формы), который должен быть отображен в именованном окне. Атрибуту target этих элементов можно также присвоить значение «_blank», «_parent» или «_top», чтобы открыть документ в новом пустом окне, родительском окне или фрейме или в окне верхнего уровня.

Имя окна, если оно имеется, хранится в свойстве name объекта Window. Данное свойство доступно для записи, и сценарии могут изменять его по мере необходимости. Если методу Window.open() передать имя (отличное от «_blank»), окно, созданное вызовом этого метода, получит указанное имя, как начальное значение свойства name. Если элемент <iframe> имеет атрибут name, объект Window, представляющий этот фрейм, будет использовать значение атрибута name как начальное значение свойства name.

************************************

Третий необязательный аргумент ореn() - это список параметров, определяющих размер и видимые элементы графического пользовательского интерфейса нового окна. Если опустить этот аргумент, окно получает размер по умолчанию и полный набор графических элементов: строку меню, строку состояния, панель инструментов и т.д. В броузерах, поддерживающих вкладки, это обычно приводит к созданию новой вкладки. Указав этот аргумент, можно явно определить размер окна и набор имеющихся в нем элементов управления. (Если явно указать размер, в большинстве случаев это приведет к созданию нового окна, а не вкладки.) Например, маленькое окно с изменяемым размером, имеющее строку состояния, но не содержащее меню, панели инструментов и адресную строку, можно открыть посредством следующим образом:

var w = window.open("smallwin.html", "smallwin",
"width=400,height=350,status=yes,resizable=yes");

Этот третий аргумент является нестандартным, и спецификация HTML5 требует, чтобы броузеры игнорировали его. Подробнее о том, какие параметры можно указывать в этом аргументе, рассказывается в описании метода Window.open() в четвертой части книги. Обратите внимание, что, когда указывается третий аргумент, любые не заданные явно элементы управления отсутствуют. По ряду причин, связанных с проблемами безопасности, броузеры накладывают ограничения на характеристики, которые можно передать методу. Так, например, невозможно открыть слишком маленькое окно или открыть его за пределами видимой области экрана; кроме того, некоторые броузеры не допускают возможности создания окон без строки состояния.

Указывать четвертый аргументopen() имеет смысл, только если второй аргумент определяет имя существующего окна. Этот аргумент - логическое значение, определяющее, должен ли URL-адрес, указанный в первом аргументе, заменить текущую запись в истории просмотра окна (true) или требуется создать новую запись (false). Если этот аргумент опущен, используется значение по умолчанию false.

Значение, возвращаемое методом open(), является объектом Window, представляющим вновь созданное окно. Этот объект позволяет сослаться в JavaScript-коде на новое окно так же, как исходный объект Window ссылается на окно, в котором выполняется сценарий:

var w = window.open(); // Открыть новое пустое окно
w.alert("Будет открыт сайт http://example.com"); // Вызвать его метод alert()
w.location = "http://example.com"; // Установить св-во location

В окнах, созданных методом window.open(), свойство opener ссылается на объект Window сценария, открывшего его. В других случаях свойство opener получает значение null:

w.opener !== null; // Верно для любого окна w, созданного методом open()
w.open().opener === w; // Верно для любого окна w

Метод Window.open() часто используется рекламодателями для создания «всплывающих окон» с рекламой, когда пользователь путешествует по Всемирной паутине. Такие всплывающие окна могут раздражать пользователя, поэтому большинство веб-броузеров реализуют механизм блокирования всплывающих окон. Обычно вызов метода open() преуспевает, только если он производится в ответ на действия пользователя, такие как щелчок мышью на кнопке или на ссылке. Попытка открыть всплывающее окно, которая производится, когда броузер просто загружает (или выгружает) страницу, обычно оканчивается неудачей. Попытка протестировать представленные выше строки программного кода в консоли JavaScript вашего броузера также может окончиться неудачей по тем же причинам.

14.8.1.1. Закрытие окон

Новое окно открывается при помощи метода open() и закрывается при помощи метода close(). Если объект Window был создан сценарием, то этот же сценарий сможет закрыть его следующей инструкцией:

w.close();

JavaScript-код, выполняющийся внутри данного окна, может закрыть его так:

window.close();

Обратите внимание на явное использование идентификатора window для устранения неоднозначности между методом close() объекта Window и методом close() объекта Document - это важно, если метод close() вызывается внутри обработчика события.

Большинство броузеров разрешают программисту автоматически закрывать только те окна, которые были созданы его собственным JavaScript-кодом. Если сценарий попытается закрыть любое другое окно, появится диалоговое окно с запросом к пользователю подтвердить (или отменить) закрытие окна. Вызов метода close() объекта Window, представляющего фрейм, а не окно верхнего уровня или вкладку, не выполняет никаких действий: нельзя закрыть фрейм (можно только удалить элемент <iframe> из содержащего его документа).

Объект Window продолжает существовать и после закрытия представляемого им окна. Однако не следует использовать какие-либо его свойства или методы, исключая проверку свойства closed. Если окно было закрыто, это свойство будет иметь значение true, свойство document - значение null, а методы окна обычно не выполняются.

Оглавление книги


Генерация: 1.867. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз