Диалоговые окна и всплывающие элементы
Диалоговые окна и всплывающие элементы — это временные элементы пользовательского интерфейса, которые отображаются, когда что-то происходит, для чего требуется уведомление, утверждение или дополнительная информация от пользователя.
Диалоги
Диалоговые окна — это модальные наложения пользовательского интерфейса, предоставляющие контекстные сведения о приложении. Диалоговые окна блокируют взаимодействие с окном приложения, пока не будут явно отклонены. Они часто запрашивают от пользователя какое-то действие.
Всплывающие элементы

Всплывающее окно — это упрощенное контекстное всплывающее окно, которое отображает пользовательский интерфейс, связанный с тем, что делает пользователь. Он включает логику расположения и размеров и может использоваться для отображения дополнительного элемента управления или отображения дополнительных сведений об элементе.
В отличие от диалогового окна, всплывающий элемент можно быстро закрыть, нажав или щелкнув где-то за пределами всплывающего окна, нажав клавишу ESCAPE или кнопку «Назад», изменить размер окна приложения или изменить ориентацию устройства.
Выбор правильного элемента управления
Диалоговые окна и всплывающие элементы убедитесь, что пользователи знают о важных сведениях, но также нарушают взаимодействие с пользователем. Так как диалоговые окна модальны (приводят к блокировке), они прерывают работу пользователей и мешают им выполнять дальнейшие действия, пока не произойдет взаимодействие с диалоговым окном. Всплывающие элементы обеспечивают менее широкий интерфейс, но отображение слишком большого количества всплывающих элементов может отвлекать.
После определения того, что вы хотите использовать диалоговое окно или всплывающий элемент, необходимо выбрать один из них.
Учитывая, что диалоговые окна блокируют взаимодействие и всплывающие элементы, диалоги должны быть зарезервированы для ситуаций, когда пользователь должен удалить все, чтобы сосредоточиться на определенном бите информации или ответить на вопрос. Всплывающие элементы, с другой стороны, можно использовать, когда вы хотите привлечь внимание к чему-то, но это нормально, если пользователь хочет игнорировать его.
Используйте диалоговое окно в следующих целях.
- Выражение важных сведений, которые пользователь должен прочитать и подтвердить перед продолжением. Примеры:
- Если безопасность пользователя может быть скомпрометирована
- Когда пользователь будет постоянно изменять ценный ресурс
- Когда пользователь собирался удалить ценный ресурс
- Подтверждение покупки в приложении
Используйте всплывающий элемент в следующих целях.
- Сбор дополнительных сведений, необходимых для завершения действия.
- Отображение временно актуальных сведений. Например, в приложении коллекции фотографий, когда пользователь щелкает эскиз изображения, можно использовать всплывающее меню для отображения большой версии изображения.
- Отображение дополнительных сведений, таких как сведения или более длинные описания элемента на странице.
Как избавиться от ненужных диалоговых окон и всплывающих элементов
Учитывайте важность информации, которую требуется отобразить: важна ли она настолько, чтобы прерывать пользователя? Кроме того, учитывайте частоту отображения информации; Если вы отображаете диалоговое окно или уведомление каждые несколько минут, вместо этого может потребоваться выделить пространство для этих сведений в основном пользовательском интерфейсе. Например, в клиенте чата вместо всплывающих элементов при каждом входе в систему вы можете отобразить список друзей, которые находятся в сети в данный момент, и выделить друзей по мере входа.
Диалоговые окна часто используются для подтверждения действия (например, удаления файла) перед его выполнением. Если вы ожидаете, что пользователь часто выполняет определенное действие, рассмотрите возможность отмены действия, если это была ошибка, а не заставляйте пользователей подтвердить действие каждый раз.
Примеры
- Если у вас установлено приложение из коллекции WinUI 3, щелкните здесь, чтобы открыть его и увидеть ContentDialog или Flyout в действии. Получите приложение из Microsoft Store или получите исходный код в GitHub.
Открытие окон и методы window
Всплывающее окно («попап» – от англ. Popup window) – один из древнейших способов показать пользователю ещё один документ.
window.open('https://javascript.info/')… и откроется новое окно с указанным URL. Большинство современных браузеров по умолчанию будут открывать новую вкладку вместо отдельного окна.
Попапы существуют с доисторических времён. Они были придуманы для отображения нового контента поверх открытого главного окна. Но с тех пор появились другие способы сделать это: JavaScript может загрузить содержимое вызовом fetch и показать его в тут же созданном , так что попапы используются не каждый день.
Кроме того, попапы не очень хороши для мобильных устройств, которые не умеют показывать несколько окон одновременно.
Однако, для некоторых задач попапы ещё используются, например для OAuth-авторизации (вход через Google/Facebook/…), так как:
- Попап – это отдельное окно со своим JavaScript-окружением. Так что открытие попапа со стороннего, не доверенного сайта вполне безопасно
- Открыть попап очень просто.
- Попап может производить навигацию (менять URL) и отсылать сообщения в основное окно.
Блокировка попапов
В прошлом злонамеренные сайты заваливали посетителей всплывающими окнами. Такие страницы могли открывать сотни попапов с рекламой. Поэтому теперь большинство браузеров пытаются заблокировать всплывающие окна, чтобы защитить пользователя.
Всплывающее окно блокируется в том случае, если вызов window.open произошёл не в результате действия посетителя (например, события onclick ).
// попап заблокирован window.open('https://javascript.info'); // попап будет показан button.onclick = () => < window.open('https://javascript.info'); >;Таким образом браузеры могут защитить пользователя от появления нежелательных попапов, при этом не отключая попапы полностью.
Полный синтаксис 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) – позволяет отключить полосы прокрутки для нового окна. Не рекомендуется.
Помимо этого существует некоторое количество не кроссбраузерных значений, которые обычно не используются. Найти примеры таких свойств можно по ссылке.
Пример: минималистичное окно
Давайте откроем окно с минимальным набором настроек, просто чтобы посмотреть, какие из них браузер позволит отключить:
let params = `scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no, width=0,height=0,left=-1000,top=-1000`; open('/', 'test', params);В этом примере большинство настроек заблокированы и само окно находится за пределами видимой области экрана. Посмотрим, что получится в результате. Большинство браузеров «исправит» странные значения – как, например, нулевые width/height и отрицательные left/top . Например, Chrome установит высоту и ширину такого окна равной высоте и ширине экрана, так что попап будет занимать весь экран.
Давайте исправим значения и зададим нормальные координаты ( left и top ) и значения размеров окна ( width и height ):
let params = `scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no, width=600,height=300,left=100,top=100`; open('/', 'test', params);Большинство браузеров выведет окно с заданными нами настройками.
Правила для опущенных параметров:
- Если третий аргумент при вызове open отсутствует или он пустой, будут использованы настройки окна по умолчанию.
- Если строка параметров передана, но некоторые параметры yes/no пропущены, то считается, что указано no , так что соответствующие возможности будут отключены, если на это нет ограничений со стороны браузера. Поэтому при задании параметров убедитесь, что вы явно указали все необходимые yes.
- Если координаты left/top не заданы, браузер попытается открыть новое окно рядом с предыдущим открытым окном.
- Если не заданы размеры окна width/height , браузер откроет новое окно с теми же размерами, что и предыдущее открытое окно.
Доступ к попапу из основного окна
Вызов open возвращает ссылку на новое окно. Эта ссылка может быть использована для управления свойствами окна, например, изменения положения и др.
Например, здесь мы генерируем содержимое попапа из JavaScript:
let newWin = window.open("about:blank", "hello", "width=200,height=200"); newWin.document.write("Hello, world!");А здесь содержимое окна модифицируется после загрузки:
let newWindow = open('/', 'example', 'width=300,height=300') newWindow.focus(); alert(newWindow.location.href); // (*) about:blank, загрузка ещё не началась newWindow.onload = function() < let html = `Добро пожаловать!`; newWindow.document.body.insertAdjacentHTML('afterbegin', html); >;Обратите внимание: сразу после 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( "window.opener.document.body.innerHTML = 'Тест'" );Так что связь между окнами двусторонняя: главное окно и попап имеют ссылки друг на друга.
Закрытие попапа
Чтобы закрыть окно: win.close()
Для проверки, закрыто ли окно: win.closed .
Технически метод close() доступен для любого окна, но window.close() будет игнорироваться большинством браузеров, если window не было создано с помощью window.open() . Так что он сработает только для попапов.
Если окно закрыто, то его свойство closed имеет значение true . Таким образом можно легко проверить, закрыт ли попап (или главное окно) или все ещё открыт. Пользователь может закрыть его в любой момент, и наш код должен учитывать эту возможность.
Этот код откроет и затем закроет окно:
let newWindow = open('/', 'example', 'width=300,height=300'); newWindow.onload = function() < newWindow.close(); alert(newWindow.closed); // true >;Прокрутка и изменение размеров
Методы для передвижения и изменения размеров окна:
win.moveBy(x,y) Переместить окно относительно текущей позиции на x пикселей вправо и y пикселей вниз. Допустимы отрицательные значения (для перемещения окна влево и вверх). win.moveTo(x,y) Переместить окно на координаты экрана (x,y) . win.resizeBy(width,height) Изменить размер окна на указанные значения width/height относительно текущего размера. Допустимы отрицательные значения. win.resizeTo(width,height) Изменить размер окна до указанных значений.
Также существует событие window.onresize .
Только попапы
Чтобы предотвратить возможные злоупотребления, браузер обычно блокирует эти методы. Они гарантированно работают только с попапами, которые мы открыли сами и у которых нет дополнительных вкладок.
Нельзя свернуть/развернуть окно
Методами JavaScript нельзя свернуть или развернуть («максимизировать») окно на весь экран. За это отвечают функции уровня операционной системы, и они скрыты от фронтенд-разработчиков.
Методы перемещения и изменения размера окна не работают для свернутых и развёрнутых на весь экран окон.
Прокрутка окна
Мы уже говорили о прокрутке окна в главе Размеры и прокрутка окна.
win.scrollBy(x,y) Прокрутить окно на x пикселей вправо и y пикселей вниз относительно текущей прокрутки. Допустимы отрицательные значения. win.scrollTo(x,y) Прокрутить окно до заданных координат (x,y) . elem.scrollIntoView(top = true) Прокрутить окно так, чтобы elem для elem.scrollIntoView(false) появился вверху (по умолчанию) или внизу.
Также существует событие window.onscroll .
Установка и потеря фокуса
Теоретически, установить попап в фокус можно с помощью метода window.focus() , а убрать из фокуса – с помощью window.blur() . Также существуют события focus/blur , которые позволяют отследить, когда фокус переводится на какое-то другое окно.
Раньше на «плохих» сайтах эти методы могли становиться средством манипуляции. Например:
window.onblur = () => window.focus();Когда пользователь пытается перевести фокус на другое окно, этот код возвращает фокус назад. Таким образом, фокус как бы «блокируется» в попапе, который не нужен пользователю.
Из-за этого в браузерах и появились ограничения, которые препятствуют такого рода поведению фокуса. Эти ограничения нужны для защиты пользователя от назойливой рекламы и «плохих» страниц, и их работа различается в зависимости от конкретного браузера.
Например, мобильный браузер обычно полностью игнорирует такие вызовы метода window.focus() . Также фокусировка не работает, когда попап открыт в отдельной вкладке (в отличие от открытия в отдельном окне).
Но всё-таки иногда методы фокусировки бывают полезны. Например:
- Когда мы открываем попап, может быть хорошей идеей запустить для него newWindow.focus() . Для некоторых комбинаций браузера и операционной системы это устранит неоднозначность – заметит ли пользователь это новое окно.
- Если нужно отследить, когда посетитель использует веб-приложение, можно отслеживать window.onfocus/onblur . Это позволит ставить на паузу и продолжать выполнение анимаций и других интерактивных действий на странице. При этом важно помнить, что blur означает, что окно больше не в фокусе, но пользователь может по-прежнему видеть его.
Итого
Всплывающие окна используются нечасто. Ведь загрузить новую информацию можно динамически, а показать – в элементе , расположенным над страницей ( z-index ). Ещё одна альтернатива – тег .
Если мы открываем попап, хорошей практикой будет предупредить пользователя об этом. Иконка открывающегося окошка на ссылке поможет посетителю понять, что происходит и не потерять оба окна из поля зрения.
- Новое окно можно открыть с помощью вызова open(url, name, params) . Этот метод возвращает ссылку на это новое окно.
- По умолчанию браузеры блокируют вызовы open , выполненные не в результате действий пользователя. Обычно браузеры показывают предупреждение, так что пользователь всё-таки может разрешить вызов этого метода.
- Вместо попапа открывается вкладка, если в вызове open не указаны его размеры.
- У попапа есть доступ к породившему его окну через свойство window.opener .
- Если основное окно и попап имеют один домен и протокол, то они свободно могут читать и изменять друг друга. В противном случае, они могут только изменять положение друг друга и взаимодействовать с помощью сообщений.
Чтобы закрыть попап: метод close() . Также попап может закрыть и пользователь (как и любое другое окно). После закрытия окна свойство window.closed имеет значение true .
- Методы focus() и blur() позволяют установить или убрать фокус с попапа. Но работают не всегда.
- События focus и blur позволяют отследить получение и потерю фокуса новым окном. Но, пожалуйста, не забывайте, что окно может остаться видимым и после blur .
WEB UI Создание и вызов всплывающего окна. Часть 4 Передача данных во всплывающее окно.

Ранее мы создали всплывающее окно: Раз, Два, Три. Скорее всего, нам потребуется передать в него какую-то информацию из исходного окна.
Делается это довольно просто. Сначала создадим сущность с данными, после передадим ее в метод OPEN
Отладка POP-UP окна

Если необходимо отладить окно, а ввести /h некуда можно воспользоваться двумя способами:
- Создать текстовый файл *.txt с текстом:
[Function]
Command=/H
Type=SystemCommandКогда это необходимо, просто перетащить его в окно. При этом будет эффект такой же как и при вводе /h
2. Создать ярлык:


Заходим в SAP LOGON Ярлыки

И выбираем наш. При этом активируется отладка в указанной системе.

Продолжаем работать в нашем окне, и проваливаемся в отладчик.
