Javascript работа с windows

Объект Window в JavaScript

Для создания всплывающих окон в JavaScript используется объект Window. У этого объекта существует ещё одна классная функция, о которой мы поговорим ближе к концу статьи. А пока о том, как использовать объект Window в JavaScript по своему прямому назначению.

Конструктора у объекта Window, в том плане, что он закрыт, поэтому окна создаются через метод объекта Windowopen():

var win = window.open(«http://myrusakov.ru», «My Window»);

В данном примере мы создаём окно, в которое будет подгружен сайт: «http://myrusakov.ru«, а имя нового окна будет: «My Window«. Это простейший вариант создания окна в JavaScript. Однако, у метода open() существует ещё один необязательный параметр, с настройками нового окна:

var win = window.open(«http://myrusakov.ru», «My Window», «width=400,height=500,menubar=yes,toolbar=no,location=yes,scrollbars=yes»);

Обратите внимание на то, что этот параметр имеет очень жёсткие условия в плане синтаксиса: никаких пробелов быть вообще не должно. А именно эту ошибку чаще всего и допускают. Теперь о параметрах:

  • Width — отвечает за ширину нового окна.
  • Height — отвечает за высоту нового окна.
  • Menubar — если стоит «yes«, то в новом окне будет меню, если стоит «no«, то, соответственно, меню не будет.
  • Toolbar — отвечает за наличие панели инструментов.
  • Location — отвечает за наличие адресной строки в новом окне.
  • Scrollbars — отвечает за наличие полос прокрутки.

Теперь переходим к методам, позволяющим управлять объектом Window в JavaScript. Сразу хочется заметить, что глобальное окно (в котором и выполняется наш скрипт) также является экземпляром объекта Window, и именно к нему и будут применены некоторые методы.

А начнём мы с простейших методов — focus() и blur(). Эти методы позволяют навести фокус на окно (focus()) и, наоборот, потерять его (blur()). Если вдруг, кто не знает, то фокус — это когда окно становится активным. Когда окно перестаёт быть активным (переключились на другое окно), то говорят, что окно теряет фокус. В следующем примере демонстрируется использование этих двух методов:

Здесь мы даём фокус нашему окну, потом ставим некую задержку (пока не буду приводить код задержки, чуть попозже, потерпите, пожалуйста), а потом снимаем фокус.

Метод close() позволяет закрыть окно:

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

Есть ещё и другие методы в объекта Window, которые тоже могут использоваться — это методы back() и forward(). Эти методы заменяют кнопки «Назад» и «Вперёд» в браузере. Иногда это используют, чтобы сайт был более удобен для пользователя (например, сделать кнопки на сайте для возврата на предыдущую страницу). Применение этих методов очевидное и очень простое:

И при заходе на эту страницу пользователь автоматически вернётся назад (при условии, что есть куда возвращаться, конечно). Аналогичный метод и forward(). Но сейчас я хочу, чтобы Вы обратили внимание на то, что мы применили в этот раз метод к глобальному окну, а разработчики нам позволили этот глобальный объект не писать, то есть, например, так:

Очевидно, что если бы применяли метод к объекту Window, который мы создали через open(), то пришлось бы писать его имя, как мы делали раньше.

Теперь перейдём к методам, которые используют очень часто, — таймерам в JavaScript. Есть всего два метода для работы с таймерами. Первый метод — это setTimeout(). Эта функция принимает два параметра: функцию (либо код), которую нужно выполнить, и второй параметр — задержку (в миллисекундах), через которую надо выполнить функцию (либо код). Вот пример:

setTimeout(func, 3000);
function func () <
alert(«Прошло 3 секунды»);
>

Если Вы запустите данный скрипт, то через 3 секунды после начала выполнения Вы увидите информационное сообщение. Обратите внимание, что метод setTimeout() применён к глобальному окну, поэтому мы не писали так: «window.setTimeout()«. Хотя, конечно, так тоже можно писать, просто разработчики JavaScript предоставили нам сокращённую запись.

Если требуется остановить таймер, то используется метод clearTimeout(), который принимает в качестве параметра идентификатор, полученный при использовании метод setTimeout():

Читайте также:  Intel rst драйвера для windows 10

var + 4″, 5000);
clearTimeout(id);

То есть сразу после запуска таймера, мы его останавливаем, соответственно, выражение: «3 + 4» посчитано не будет.

Ключевая особенность метода setTimeout() в том, что он выполняется всего один раз. В нашем примере, он вызвал функцию func() и всё. Больше эта функция вызываться через таймер не будет. А вот для того, чтобы настроить регулярное срабатывание таймера через равные промежутки времени используется метод setInterval():

var counter = 0;
var 5000, «Tommy»);
function func(name) <
counter++;
alert(name + «, уже прошло » + (counter * 5) + » секунд!»);
if (counter == 4) clearInterval(id);
>

В данном случае, мы создали глобальную переменную counter, которая показывает, сколько раз была вызвана функция. От неё считается и прошедшее время после начала выполнения скрипта. Также заметьте, что функция func() требует параметр. Этот параметр передаётся в методе setInterval() сразу после параметра с задержкой. Если будет два параметра в функции, то в методе setInterval() также надо будет дописать ещё два передающихся параметра. Такие же правила и для метода setTimeout().

В скрипте после 4-х вызовов функции мы останавливаем непрерывное выполнение таймера.

Вот и все методы объекта Window, который используется очень часто, хотя бы потому что этот объект является глобальным, и именно к нему мы в следующих статья будем обращаться, только не к самому объекту Window, а уже к его свойствам, которые сами являются крупнейшими объектами в JavaScript.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 21 ):

    Можно ли открыть окно win = window.open, а через N секунд используя setTimeout закрыть его?

    Чем ждать ответа, проще самому взять и проверить, причём этот вариант будет в 100 раз полезнее.

    Проверил и до, и после. Открыл многое другое, например, что setTimeout(func(),1000) не работает из-за скобок функции (принял как данность). Но как закрыть открытое окно не понял ни из видео-урока, ни из учебника. Оставил в надежде, что разберусь в дальнейшем. Вопрос поднял, чтобы указать какое место мне непонятно.

    Открытие окон и методы window

    Материал на этой странице устарел, поэтому скрыт из оглавления сайта.

    Более новая информация по этой теме находится на странице https://learn.javascript.ru/popup-windows.

    Всплывающее окно («попап» – от англ. Popup window) – один из старейших способов показать пользователю ещё один документ.

    В этой статье мы рассмотрим открытие окон и ряд тонких моментов, которые с этим связаны.

    …При запуске откроется новое окно с указанным URL.

    Большинство браузеров по умолчанию создают новую вкладку вместо отдельного окна, но чуть далее мы увидим, что можно и «заказать» именно окно.

    Блокировщик всплывающих окон

    Рекламные попапы очень надоели посетителям, аж со времён 20-го века, поэтому современные браузеры всплывающие окна обычно блокируют. При этом пользователь, конечно, может изменить настройки блокирования для конкретного сайта.

    Всплывающее окно блокируется в том случае, если вызов window.open произошёл не в результате действия посетителя.

    Как же браузер понимает – посетитель вызвал открытие окна или нет?

    Для этого при работе скрипта он хранит внутренний «флаг», который говорит – инициировал посетитель выполнение или нет. Например, при клике на кнопку весь код, который выполнится в результате, включая вложенные вызовы, будет иметь флаг «инициировано посетителем» и попапы при этом разрешены.

    А если код был на странице и выполнился автоматически при её загрузке – у него этого флага не будет. Попапы будут заблокированы.

    Полный синтаксис window.open

    Функция возвращает ссылку на объект window нового окна, либо null , если окно было заблокировано браузером.

    url URL для загрузки в новое окно. name Имя нового окна. Может быть использовано в параметре target в формах. Если позднее вызвать window.open() с тем же именем, то браузеры (кроме IE) заменяют существующее окно на новое. params Строка с конфигурацией для нового окна. Состоит из параметров, перечисленных через запятую. Пробелов в ней быть не должно.

    Читайте также:  Mac os iso образ для флешки

    Значения параметров params .

    1. Настройки расположения окна:

    left/top (число)

    Координаты верхнего левого угла относительно экрана. Ограничение: новое окно не может быть позиционировано за пределами экрана.

    Ширина/высота нового окна. Минимальные значения ограничены, так что невозможно создать невидимое окно с нулевыми размерами.

    Если координаты и размеры не указаны, то обычно браузер открывает не окно, а новую вкладку.

    1. Свойства окна:

    menubar (yes/no) Скрыть или показать строку меню браузера. toolbar (yes/no) Показать или скрыть панель навигации браузера (кнопки назад, вперёд, обновить страницу и остальные) в новом окне. location (yes/no) Показать/скрыть поле URL-адреса в новом окне. По умолчанию Firefox и IE не позволяют скрывать строку адреса. status (yes/no) Показать или скрыть строку состояния. С другой стороны, браузер может в принудительном порядке показать строку состояния. resizable (yes/no) Позволяет отключить возможность изменять размеры нового окна. Значение no обычно неудобно посетителям. scrollbars (yes/no) Разрешает убрать полосы прокрутки для нового окна. Значение no обычно неудобно посетителям.

    1. Ещё есть небольшое количество не кросс-браузерных свойств, которые обычно не используются. Вы можете узнать о них в документации, например MDN: window.open.

    Браузер подходит к этим параметрам интеллектуально. Он может проигнорировать их часть или даже все, они скорее являются «пожеланиями», нежели «требованиями».

    • Если при вызове open указан только первый параметр, параметр отсутствует, то используются параметры по умолчанию. Обычно при этом будет открыто не окно, а вкладка, что зачастую более удобно.
    • Если указана строка с параметрами, но некоторые yes/no параметры отсутствуют, то браузер выставляет их в no . Поэтому убедитесь, что все нужные вам параметры выставлены в yes .
    • Когда не указан top/left , то браузер откроет окно с небольшим смещением относительно левого верхнего угла последнего открытого окна.
    • Если не указаны width/height , новое окно будет такого же размера, как последнее открытое.

    Доступ к новому окну

    Вызов window.open возвращает ссылку на новое окно. Она может быть использована для манипуляции свойствами окна, изменения URL, доступа к его переменным и т.п.

    В примере ниже мы заполняем новое окно содержимым целиком из JavaScript:

    Открытие окон и методы window

    Всплывающее окно («попап» – от англ. Popup window) – один из древнейших способов показать пользователю ещё один документ.

    … и откроется новое окно с указанным URL. Большинство современных браузеров по умолчанию будут открывать новую вкладку вместо отдельного окна.

    Попапы существуют с доисторических времён. Они были придуманы для отображения нового контента поверх открытого главного окна. Но с тех пор появились другие способы сделать это: JavaScript может загрузить содержимое вызовом fetch и показать его в тут же созданном

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

    Однако, для некоторых задач попапы ещё используются, например для OAuth-авторизации (вход через Google/Facebook/…), так как:

    1. Попап – это отдельное окно со своим JavaScript-окружением. Так что открытие попапа со стороннего, не доверенного сайта вполне безопасно
    2. Открыть попап очень просто.
    3. Попап может производить навигацию (менять URL) и отсылать сообщения в основное окно.

    Блокировка попапов

    В прошлом злонамеренные сайты заваливали посетителей всплывающими окнами. Такие страницы могли открывать сотни попапов с рекламой. Поэтому теперь большинство браузеров пытаются заблокировать всплывающие окна, чтобы защитить пользователя.

    Всплывающее окно блокируется в том случае, если вызов window.open произошёл не в результате действия посетителя (например, события onclick ).

    Таким образом браузеры могут защитить пользователя от появления нежелательных попапов, при этом не отключая попапы полностью.

    Что, если попап должен открываться в результате onclick , но не сразу, а только после выполнения setTimeout ? Здесь все не так-то просто.

    Попап откроется в Chrome, но будет заблокирован в Firefox.

    Но если мы уменьшим тайм-аут до одной секунды, то попап откроется и в Firefox:

    Мы получили два разных результата из-за того, что Firefox «допускает» таймаут в 2000 мс или менее, но все, что свыше этого – не вызывает его доверия, т.к. предполагается, что в таком случае открытие окна происходит без ведома пользователя. Именно поэтому попап из первого примера будет заблокирован, а из второго – нет.

    Читайте также:  Windows 10 professional build dvd

    Полный синтаксис window.open

    Синтаксис открытия нового окна: window.open(url, name, params) :

    url URL для загрузки в новом окне. name Имя нового окна. У каждого окна есть свойство window.name , в котором можно задавать, какое окно использовать для попапа. Таким образом, если уже существует окно с заданным именем – указанный в параметрах URL откроется в нем, в противном случае откроется новое окно. params Строка параметров для нового окна. Содержит настройки, разделённые запятыми. Важно помнить, что в данной строке не должно быть пробелов. Например width=200,height=100 .

    Параметры в строке params :

    • Позиция окна:
      • left/top (числа) – координаты верхнего левого угла нового окна на экране. Существует ограничение: новое окно не может быть позиционировано вне видимой области экрана.
      • width/height (числа) – ширина и высота нового окна. Существуют ограничения на минимальную высоту и ширину, которые делают невозможным создание невидимого окна.
    • Панели окна:
      • menubar (yes/no) – позволяет отобразить или скрыть меню браузера в новом окне.
      • toolbar (yes/no) – позволяет отобразить или скрыть панель навигации браузера (кнопки вперёд, назад, перезагрузки страницы) нового окна.
      • location (yes/no) – позволяет отобразить или скрыть адресную строку нового окна. Firefox и IE не позволяют скрывать эту панель по умолчанию.
      • status (yes/no) – позволяет отобразить или скрыть строку состояния. Как и с адресной строкой, большинство браузеров будут принудительно показывать её.
      • resizable (yes/no) – позволяет отключить возможность изменения размера нового окна. Не рекомендуется.
      • scrollbars (yes/no) – позволяет отключить полосы прокрутки для нового окна. Не рекомендуется.

    Помимо этого существует некоторое количество не кроссбраузерных значений, которые обычно не используются. Найти примеры таких свойств можно по ссылке.

    Пример: минималистичное окно

    Давайте откроем окно с минимальным набором настроек, просто чтобы посмотреть, какие из них браузер позволит отключить:

    В этом примере большинство настроек заблокированы и само окно находится за пределами видимой области экрана. Посмотрим, что получится в результате. Большинство браузеров «исправит» странные значения – как, например, нулевые width/height и отрицательные left/top . Например, Chrome установит высоту и ширину такого окна равной высоте и ширине экрана, так что попап будет занимать весь экран.

    Давайте исправим значения и зададим нормальные координаты ( left и top ) и значения размеров окна ( width и height ):

    Большинство браузеров выведет окно с заданными нами настройками.

    Правила для опущенных параметров:

    • Если третий аргумент при вызове open отсутствует или он пустой, будут использованы настройки окна по умолчанию.
    • Если строка параметров передана, но некоторые параметры yes/no пропущены, то считается, что указано no , так что соответствующие возможности будут отключены, если на это нет ограничений со стороны браузера. Поэтому при задании параметров убедитесь, что вы явно указали все необходимые yes.
    • Если координаты left/top не заданы, браузер попытается открыть новое окно рядом с предыдущим открытым окном.
    • Если не заданы размеры окна width/height , браузер откроет новое окно с теми же размерами, что и предыдущее открытое окно.

    Доступ к попапу из основного окна

    Вызов open возвращает ссылку на новое окно. Эта ссылка может быть использована для управления свойствами окна, например, изменения положения и др.

    Например, здесь мы генерируем содержимое попапа из JavaScript:

    А здесь содержимое окна модифицируется после загрузки:

    Обратите внимание: сразу после window.open новое окно ещё не загружено. Это демонстрируется в строке (*) . Так что нужно ждать onload , чтобы его изменить. Или же поставить обработчик DOMContentLoaded на newWin.document .

    Окна имеют свободный доступ к содержимому друг друга только если они с одного источника (у них совпадают домен, протокол и порт (protocol://domain:port).

    Иначе, например, если основное окно с site.com , а попап с gmail.com , это невозможно по соображениям пользовательской безопасности. Детали см. в главе Общение между окнами.

    Доступ к открывшему окну из попапа

    Попап также может обратиться к открывшему его окну по ссылке window.opener . Она равна null для всех окон, кроме попапов.

    Если вы запустите код ниже, то он заменит содержимое открывшего (текущего) окна на «Тест»:

    let newWin = window.open(«about:blank», «hello», «width=200,height=200»); newWin.document.write( «

    Комментарии

    • Если вам кажется, что в статье что-то не так — вместо комментария напишите на GitHub.
    • Для одной строки кода используйте тег , для нескольких строк кода — тег

    , если больше 10 строк — ссылку на песочницу (plnkr, JSBin, codepen…)

  • Если что-то непонятно в статье — пишите, что именно и с какого места.
  • Оцените статью