Клиенты: метод openWindow()
Базовая Широко доступная
Эта функция хорошо отработана и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с апреля 2018 года.
Примечание: Эта функция доступна только в Сервис-воркерах.
Метод openWindow() интерфейса Clients создаёт новый контекст просмотра верхнего уровня и загружает указанный URL. Если вызывающему скрипту нет разрешения отображать всплывающие окна, openWindow() выбросит InvalidAccessError.
В Firefox, метод разрешено отображать всплывающие окна только при вызове в результате события клика по уведомлению.
В Chrome для Android, метод может вместо этого открыть URL в существующем контексте просмотра, предоставляемом автономным веб-приложением, ранее добавленным в домашний экран пользователя. В последнее время это также работает в Chrome для Windows.
Синтаксис
openWindow(url)
Параметры
url-
Строка, представляющая URL клиента, который вы хотите открыть в окне. Как правило, это значение должно быть URL с той же областью, что и вызывающий скрипт.
Возвращаемое значение
Объект Promise, который возвращает объект WindowClient, если URL находится в той же области, что и сервис-воркер, или null в противном случае.
Исключения
-
InvalidAccessErrorDOMException -
Обещание отклоняется с этим исключением, если ни одно из окон в области приложения не имеет временной активации.
Требования к безопасности
- По крайней мере одно окно в области приложения должно иметь временную активацию.
Примеры
// Send notification to OS if applicable
if (self.Notification.permission === "granted") {
const notificationObject = {
body: "Click here to view your messages.",
data: { url: `${self.location.origin}/some/path` },
// data: { url: 'http://example.com' },
};
self.registration.showNotification(
"You've got messages!",
notificationObject,
);
}
// Notification click event listener
self.addEventListener("notificationclick", (e) => {
// Close the notification popout
e.notification.close();
// Get all the Window clients
e.waitUntil(
clients.matchAll({ type: "window" }).then((clientsArr) => {
// If a Window tab matching the targeted URL already exists, focus that;
const hadWindowToFocus = clientsArr.some((windowClient) =>
windowClient.url === e.notification.data.url
? (windowClient.focus(), true)
: false,
);
// Otherwise, open a new tab to the applicable URL and focus it.
if (!hadWindowToFocus)
clients
.openWindow(e.notification.data.url)
.then((windowClient) => (windowClient ? windowClient.focus() : null));
}),
);
});
Спецификации
| Спецификация |
|---|
| Сервис-воркеры # clients-openwindow |
Совместимость браузеров
| Рабочий стол | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
openWindow |
40["Перед Chrome 43 этот метод мог открывать только URL в той же области.", "Начиная с Chrome 51, URL могут открываться внутри существующего контекста просмотра, предоставляемого автономным веб-приложением."] |
17 | 44 | 38 | 11.1 | 40["Перед Chrome Android 43 этот метод мог открывать только URL в той же области.", "Начиная с Chrome Android 51, URL могут открываться внутри существующего контекста просмотра, предоставляемого автономным веб-приложением."] |
44 | 41 | 11.3 | 4.0["Перед Samsung Internet 4.0 этот метод мог открывать только URL в той же области.", "Начиная с Samsung Internet 5.0, URL могут открываться внутри существующего контекста просмотра, предоставляемого автономным веб-приложением."] |
40["Перед WebView Android 43 этот метод мог открывать только URL в той же области.", "Начиная с WebView Android 51, URL могут открываться внутри существующего контекста просмотра, предоставляемого автономным веб-приложением."] |
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/Clients/openWindow