Открытие нового окна
Описание метода window.open()
Метод window.open()
открывает новое окно браузера или вкладку, как если бы в меню браузера выбрать пункт Открыть новое окно
или Открыть новую вкладку
. В это окно загружается документ в соответствии с указанными параметрами. Данный метод возвращает ссылку на объект window
открытого окна или null
, если окно не открылось.
window.open(URL, имя_окна[, параметры_окна])
- URL
- Абсолютный или относительный адрес ресурса для загрузки в новое окно. Можно указывать любые файлы (HTML-документы, картинки и т.п.), поддерживаемые браузером. Если в качестве URL передаётся пустая строка, тогда открывается пустое окно, но ничего не загружается.
- имя_окна
- Имя нового окна. Оно может использоваться в качестве значения атрибута
target
тега<a>
для перехода именно в это окно. Имя окна не должно содержать пробелов. Данный параметр не имеет отношения к заголовку окна. - параметры_окна
- Необязательный аргумент. Параметры окна передаются в виде строки, содержащей список настроек окна (размеры, положение и т.д.), разделённых запятыми. Строка не должна содержать пробелов. Изменить настройки окна после его открытия нельзя.
Пример использования:
open('https://ya.ru', 'yandex_window'); // откроет новое окно (вкладку) и загрузит страницу 'https://ya.ru'
Новое окно открывается сразу при вызове window.open()
и изначально оно пустое. Загрузка ресурса не начинается до тех пор, пока не выполнится весь текущий скриптовый блок.
Если окно с указанным именем уже открыто, тогда загрузка документа выполнится в это же окно. В этом случае метод вернёт ссылку на данное окно, а передаваемые параметры окна проигнорируются. Если и URL - пустая строка, тогда с окном вообще ничего не произойдёт. Чтобы при каждом вызове window.open()
открывалось новое окно, в качестве имени окна можно указать специальное значение
._blank
<html> <head> <title>BOM-интерфейс</title> </head> <body> <button onclick="sameWindow()">Всегда то же окно</button> <br> <button onclick="newWindow()">Всегда новое окно</button> </body> </html> <script> function sameWindow() { open('https://ya.ru', 'yandex_window'); } function newWindow() { open('https://ya.ru', '_blank'); } </script>
Если при открытии окна его параметры не указаны (третий агрумент метода window.open()
опущен или передана пустая строка), тогда внешний вид нового окна будет таким же, как у исходного (со всеми панелями инструментов), или документ загрузится в новой вкладке исходного окна браузера. Если же указан хотя бы один параметр, то все остальные параметры (кроме titlebar
и close
, которые установлены по умолчанию) считаются отменёнными.
Если параметр должен принимать числовое значение, то оно указывается после знака
(=
равно
), например
.width=640
Если опция может иметь только два состояния (включена/отключена), тогда есть три способа для её включения. Примеры:
location=yes
location=1
location
Для отключения опций им необходимо присвоить значение
или no
. По умолчанию все опции, кроме 0
titlebar
и close
, отключены. Поэтому не имеет смысла отключать остальные опции, кроме этих двух.
<html> <head> <title>BOM-интерфейс</title> </head> <body> <button onclick="newWindow()">Открыть новое окно</button> </body> </html> <script> function newWindow() { open( 'http://WebGentleman.ru/javascript/', 'WebGentleman.ru', 'width=320,height=320,scrollbars' ); } </script>
В примере выше для открываемого окна будут использоваться опции scrollbars
, titlebar
и close
, а также установлен размер области документа 320x320
пикселей.
Если в параметрах открываемого окна не указаны его размеры, тогда используются размеры исходного окна.
Если в параметрах не указано положение окна, тогда оно размещается на 22 пикселя ниже и 22 пикселя правее исходного.
Если в параметрах окна не указаны ни размеры, ни положение окна, а исходное окно развёрнуто на весь экран, новое окно тоже разворачивается на весь экран.
В некоторых браузерах пользователь может сам установить параметры открываемых окон, которые нельзя изменить опциями метода window.open()
.
Параметры окна
Размеры и положение
left
- Расстояние от левой границы экрана до окна. Окно не может быть выведено за областью экрана.
top
- Расстояние от верхней границы экрана до окна. Окно не может быть выведено за областью экрана.
height
- Высота области содержимого документа в пикселях, включая горизонтальную полосу прокрутки. Не может быть меньше 100.
width
- Ширина области содержимого документа в пикселях, включая вертикальную полосу прокрутки. Не может быть меньше 100.
Функциональность
menubar
- Используется для отображения основного меню (
Файл, Правка, Вид...
). toolbar
- Используется для отображения панелей инструментов (панель навигации, панель вкладок, панели плагинов и т.д.).
location
- Используется для отображения адресной строки.
personalbar
- Используется для отображения панели закладок.
status
- Используется для отображения строки состояния. Удаление строки состояния может привести к потере полезной информации (иногда, жизненно необходимой для пользователя) и функциональности окна, поэтому использовать эту опцию необходимо всегда.
resizable
- Разрешает изменять размер окна.
scrollbars
- Используется для отображения вертикальной и горизонтальной полос прокрутки, если элементы страницы не помещаются в области просмотра документа. Необходимо всегда включать данную опцию, чтобы пользователь имел возможность просмотреть весь документ.
titlebar
- Используется для отображения заголовка окна. По умолчанию опция включена.
close
- Используется для отображения иконок сворачивания и закрытия окна. По умолчанию опция включена.
Использование на практике
Чаще всего метод window.open()
применяется для открытия ссылок в новом окне (именно окне, а не вкладке). Это делается очень просто:
<html> <head> <title>BOM-интерфейс</title> </head> <body> <p> <a href="https://ya.ru" target="window_example_1" onclick="windowOpenExample(event)" >Поиск Yandex</a> </p> <p> <a href="https://google.ru" target="window_example_1" onclick="windowOpenExample(event)" >Поиск Google</a> </p> </body> </html> <script> var window_objects = []; /* массив всех открываемых окон */ function windowOpenExample(event) { event.preventDefault(); /* отмена действий браузера по умолчанию */ var ref_href = event.currentTarget.href; /* URL из ссылки */ var ref_target = event.currentTarget.target; /* имя окна из ссылки */ if ((window_objects[ref_target] == undefined) || window_objects[ref_target].closed) { /* если окно ещё не открыто или уже закрыто, тогда можно задать параметры для окна */ window_objects[ref_target] = window.open( ref_href, ref_target, 'top=0,left=0,height=400,width=400,resizable,scrollbars,status' ); window_objects[ref_target].moveTo(0, 0); window_objects[ref_target].resizeTo(400, 400); } else { /* если окно открыто, тогда его параметры изменить нельзя */ window_objects[ref_target] = window.open( ref_href, ref_target ); } window_objects[ref_target].focus(); /* фокусировка на окне */ } </script>
Приведённая функция загружает ресурс в новом окне и всегда фокусируется на нём, даже если окно уже было открыто.
Значения атрибутов href
и target
можно было бы передать напрямую в обработчике onclick
, но тогда при отключенном JavaScript ссылка не будет работать.
Методы moveTo()
и resizeTo()
используются на случай, если параметры окна top
, left
, height
или width
не поддерживаются браузером. Это увеличивает вероятность кроссбраузерного отображения, но не гарантирует, так как moveTo()
и resizeTo()
тоже могут не поддерживаться.
Полезные советы
Избегайте использования window.open()
Большинство браузеров позволяют открывать ссылки в новых вкладках и, зачастую, этого бывает достаточно для web-разработчика.
Использование window.open()
нежелательно по следующим причинам:
- Скорость открытия вкладки намного выше, чем скорость открытия нового окна, что является предпочтительным для пользователя.
- Чем больше открыто окон, тем сложнее навигация между ними. Навигация по вкладкам удобнее и понятнее.
- В новых окнах могут отсутствовать различные меню, панели инструментов, полосы прокрутки и т.д. Открывая ресурс в новой вкладке, об этом можно не беспокоиться.
- Открытие нового окна увеличивает нагрузку на операционную систему пользователя.
Помечайте ссылки, создающие новые окна
Пользователь может не заметить, что открылось новое окно. Это может дезориентировать его (отсутствие кнопки Назад
и т.п.), что является нежелательным моментом. Если предварительно пометить ссылку, которая должна открыться в новом окне, тогда пользователь будет готов к этому.
Указать, что ссылка откроется в новом окне, можно с помощью атрибута title
, стилизацией курсора мыши или добавлением иконки к ссылке. Пример:
<p> Наведите курсор: <a href="https://ya.ru" target="window_example_2" onclick="windowOpenExample(event)" style="cursor: url('window-open-cursor.cur'), pointer;" title="Откроется в новом окне" >Поиск Yandex <img src="window-open-icon.png" alt="Открыть в новом окне"></a> </p>
Наведите курсор: Поиск Yandex .
Также, иконку можно использовать отдельно для открытия ссылки в новом окне, а на саму ссылку обработчик не вешать. Пример:
<p> <a href="https://google.ru">Поиск Google</a> <a href="https://google.ru" target="window_example_3" title="Открыть в новом окне" onclick="windowOpenExample(event)" ><img src="window-open-icon.png" alt="Открыть в новом окне"></a> </p>
Если нажать на саму ссылку, она откроется в соответствии с настройками браузера. По клику на иконке точно откроется новое окно.
Указывайте реальный URL в атрибуте href
Обязательно необходимо использовать реальный URL в атрибуте href
. В таком случае, ссылка останется работоспособной при отключенном JavaScript или если браузер не поддерживает открытие новых окон.
Всегда используйте атрибут target
Если JavaScript отключен или не поддерживается, тогда атрибут target
подскажет браузеру, что ссылку необходимо открыть в новом окне (вкладке).
Избегайте использования _blank
Всегда используйте конкретные имена открываемых окон. Это позволит повторно использовать уже открытые окна, что увеличит скорость открытия страницы и сэкономит системные ресурсы.
Использование ключевого слова _blank
нецелесообразно, так как это приводит к открытию новых безымянных окон, которые нельзя использовать повторно.
В любом случае, хорошим считается такой код, который не противоречит окончательному выбору пользователя. Правильный код должен расширять возможности браузера и предоставлять пользователю более широкий выбор для открытия ссылок.