Использование кадров в приложениях WebView2
Кадры позволяют внедрять другие веб-страницы в собственную веб-страницу. Фрейм — это подстраница или область на веб-странице, например веб-страница на веб-странице.
Iframe — это один из типов кадров. Другие типы кадров: frameset
, portal
, embed
, fencedFrame
и object
. Тип main WebView2 для кадров — CoreWebView2Frame
, который в настоящее время включен для iframes верхнего уровня. Планируется поддержка других типов кадров.
WebView2 поддерживает API-интерфейсы для взаимодействия с iframes. Варианты действий:
- Узнайте, когда создаются iframes.
- Узнайте, когда iframes переходят по другому URL-адресу. Это работает так же, как события навигации на компьютере состояния для приложений WebView2.
- Обмен данными между ведущим приложением и iframes, отправляя сообщения в обоих направлениях.
- Разрешите приложению игнорировать
X-Frame-Options
заголовок HTTP-ответа.
См. также:
- iframes in Overview of WebView2 features and API.
- Тег iframe> HTML <
Подпишитесь на событие FrameCreated, чтобы получить кадр
Для взаимодействия с кадрами в ведущем приложении сначала нужно подписаться на FrameCreated
событие, чтобы ведущее приложение получите объект кадра. Событие FrameCreated
возникает при каждом создании нового кадра. После того как ведущее приложение получит объект кадра, используйте его для отслеживания изменений и взаимодействия с этим кадром.
Ведущее приложение должно отслеживать время существования кадра, подписавшись на событие, так как при уничтожении кадра ведущее приложение больше не сможет ссылаться CoreWebView2Frame.Destroyed
на этот кадр. Кадры создаются и уничтожаются во время каждой новой навигации веб-страницы. Используйте метод , CoreWebView2Frame.IsDestroyed
чтобы проверка, существует ли кадр.
См. также:
- iframes in Overview of WebView2 features and API.
Навигация в кадре
После создания кадра он переходит к исходному URL-адресу кадра. В iframe используются события навигации и навигации, такие как FrameNavigationStarting
и NavigationCompleted
. Когда кадр переходит к исходному URL-адресу, возникают следующие события навигации:
NavigationStarting
ContentLoading
HistoryChanged
DOMContentLoaded
NavigationCompleted
Частота навигации в кадре
Навигация может происходить в пределах кадра. В качестве простого варианта использования атрибут элемента iframe
source
является URL-адресом, например wikipedia.com, и URL-адрес загружается в iframe. Обычно навигация происходит сразу после создания кадра. Затем ContentLoading
создаются события , DOMContentLoaded
и NavigationCompleted
.
Сам кадр перемещается. Веб-страница переходит по URL-адресу. Аналогичным образом, фрейм может перемещаться.
После создания кадра он будет перемещаться по ведущему приложению. Чтобы отслеживать, что происходит на странице main, события, такие как NavigationStarting
, NavigationCompleted
и HistoryChanged
позволяют ведущему приложению перемещаться между фреймами или веб-страницами. Кадры переходят по новому URL-адресу реже, чем веб-страницы, но поддерживается тот же стиль навигации. Пользователь обычно не может перемещаться внутри кадра, хотя JavaScript включает это; кадр обычно является статическим в отношении навигации.
См. также:
- Стандартная последовательность событий в событиях навигации для приложений WebView2.
- Метод CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync . Этот метод можно использовать как для iframe, так и для веб-страницы. Скрипт должен проверка, находится ли он в iframe.
События навигации:
Что касается повторяющихся эквивалентных NavigationStarting
событий и NavigationCompleted
, то рекомендуется использовать события в CoreWebView2Frame
, а не эквивалентные, заменяемые событиями в CoreWebView2
, так как CoreWebView2Frame
тип поддерживает больше сценариев, позволяющих взаимодействовать с кадрами.
См. также:
- Стандартная последовательность событий в событиях навигации для приложений WebView2.
- События навигации в обзоре функций и API WebView2.
- Блокировка нежелательного перехода в обзоре функций и API WebView2.
Использование объектов узла в iframe
Для взаимодействия между собственной стороной ведущего приложения и JavaScript в iframe используйте объекты узла. Объект узла — это объект, который создается в хост-приложении, а затем используется из кода JavaScript на веб-странице приложения.
Использование собственных API-интерфейсов из скрипта в кадре с помощью ведущего объекта похоже на структуру страницы веб-взаимодействия или собственного взаимодействия, как описано в статье Вызов собственного кода из веб-кода:
Чтобы использовать объекты узла в iframe, выполните следующие действия:
- Определите объект узла и реализуйте
IDispatch
. - Добавьте объект узла на стороне собственного кода с помощью
AddHostObjectToScriptWithOrigins
(Win32) илиAddHostObjectToScript
(.NET). - Из JavaScript в веб-коде доступ к этому объекту узла с помощью
chrome.webview.hostObjects.<name>
API.
Для доступа к собственным объектам JavaScript и управления ими в кадре используйте AddHostObjectToScriptWithOrigins
параметр (Win32) или CoreWebView2Frame.AddHostObjectToScript
(.NET).origins
Параметр origins
указывает, к каким URL-адресам iframe будет разрешен доступ по соображениям безопасности. Этот параметр определяет URL-адреса, для которых iframes будут иметь доступ к объекту узла.
При переходе кадра по URL-адресу, отсутствующему в origins
списке, фрейм не сможет управлять ведущим объектом. Фрейм не сможет читать или записывать свойства.
См. таблицу Имя метода в методе AddHostObjectToScript
для вашей платформы. См. следующие две строки:
-
applyHostFunction
,getHostProperty
иsetHostProperty
. -
getLocalProperty
иsetLocalProperty
.
-
Метод CoreWebView2Frame.AddHostObjectToScript имеет
origins
параметр . В документации нет таблицы имен метода .
Приведенный выше метод работает следующим образом:
-
Метод CoreWebView2.AddHostObjectToScript. См. таблицу Имя метода . Прочтите оба раздела справочника по API, хотя для кадров вместо этого следует использовать метод, поддерживающий
origins
параметр .
Пример кода
См . раздел Шаг 6. Вызов AddHostObjectToScript, чтобы передать объект узла в веб-код в разделе Вызов собственного кода из веб-кода.
См. также:
- Общий доступ к объектам узла или веб-сайта в обзоре функций и API WebView2.
Отправка и получение сообщений
Сообщения можно отправлять между собственным приложением и кодом JavaScript, который находится в iframe:
- Сообщения из JavaScript можно отправлять в iframe на HTML-странице в ведущее приложение.
- Сообщения из ведущего приложения можно отправлять на JavaScript в iframe на HTML-странице.
Отправка веб-сообщений из iframe в ведущее приложение
Чтобы отправить веб-сообщения из iframe в ведущее приложение, используйте window.chrome.webview.postMessage
метод :
window.chrome.webview.postMessage(`SetTitleText ${titleText.value}`);
Чтобы получать эти сообщения в ведущем приложении, ведущее приложение должно подписаться на WebMessageReceived event
.
Отправка сообщений из ведущего приложения в iframe
Ведущее приложение отправляет сообщения в iframe, вызывая PostWebMessageAsJson
метод или PostWebMessageAsString
.
Iframe получает сообщение, подписавшись на window.chrome.webview.addEventListener('message')
событие следующим образом:
window.chrome.webview.addEventListener('message', arg => {
// implement event listener here
});
См. также:
- Взаимодействие собственного и веб-кода
- Веб-сообщения в обзоре функций и API WebView2.
Выполнение кода JavaScript в iframes с помощью ExecuteScript
Приложение WebView2 может запускать любой JavaScript в кадре с помощью ExecuteScript
.
Чтобы скрипт выполнялся в iframe, необходимо создать контекст выполнения. Контекст выполнения создается после ContentLoading
события, поэтому, если ExecuteScript
вызывается перед ContentLoading
событием, скрипт не будет выполняться и строка null
будет возвращена.
Сведения о событии см. в ContentLoading
разделе События навигации для приложений WebView2, которые допустимы для кадров, а также веб-страниц.
См. также:
- Выполнение скрипта в разделе Обзор функций и API WebView2.
Изменение сетевых событий с помощью WebResourceRequested
события в iframes
Для iframes можно прослушивать сетевые события и изменять их с помощью WebResourceRequested
события .
См. также:
- Управление сетевыми запросами в WebView2 в разделе Обзор функций и API WebView2.
- Пользовательское управление сетевыми запросами
- Экспериментальные API для предварительной версии 1.0.1222 в архивных заметках о выпуске пакета SDK для WebView2.
Ознакомьтесь с последними предварительными версиями API. Следующие ссылки содержат .1.0.1466-prerelease
В раскрывающемся списке Версия в левом верхнем углу справочной документации по API выберите последнюю предварительную версию.
-
CoreWebView2.AddWebRequestedFilter(uri, resourceContext, requestSourceKinds) Method Overload — Чтобы подписаться на сетевые запросы, принадлежащие iframe, необходимо использовать эту перегрузку
requestSourceKinds
и использоватьDocument
в качестве значения параметра. - CoreWebView2.RemoveWebRequestedFilter(uri, resourceContext, requestSourceKinds) Method Overload
- Класс CoreWebView2WebResourceRequestedEventArgs
Игнорирование X-Frame-Options для отображения веб-страницы внутри кадра
Заголовок X-Frame-Options
HTTP-ответа используется веб-страницами, чтобы предотвратить отрисовку этой веб-страницы приложением внутри кадра. Свойство AdditionalAllowedFrameAncestors
позволяет приложению обходить X-Frame-Options
заголовок, чтобы отобразить веб-страницу внутри кадра.
См. также:
Пример использования iframes в хост-приложении
В этом примере кода показано, как использовать API кадра, в том числе:
FrameCreated
CoreWebView2FrameCreatedEventArgs
DOMContentLoaded
CoreWebView2DOMContentLoadedEventArgs
ExecuteScript
Этот пример кода сокращен из MainWindow.xaml.cs в примере WebView2WpfBrowser .
void DOMContentLoadedCmdExecuted(object target, ExecutedRoutedEventArgs e)
{
// Subscribe to the FrameCreated event to obtain the frame object when
// it's created.
webView.CoreWebView2.FrameCreated += WebView_FrameCreatedDOMContentLoaded;
webView.NavigateToString(@"<!DOCTYPE html>" +
"<h1>DOMContentLoaded sample page</h1>" +
"<h2>The content to the iframe and below will be added after DOM content is loaded </h2>" +
"<iframe style='height: 200px; width: 100%;'/>");
}
void WebView_FrameCreatedDOMContentLoaded(object sender, CoreWebView2FrameCreatedEventArgs args)
{
// In order for ExecuteScriptAsync to successfully run inside the iframe,
// subscribe to the ContentLoading or DOMContentLoaded event. Once these
// events are raised, you can call ExecuteScriptAsync.
args.Frame.DOMContentLoaded += (frameSender, DOMContentLoadedArgs) =>
{
args.Frame.ExecuteScriptAsync(
"let content = document.createElement(\"h2\");" +
"content.style.color = 'blue';" +
"content.textContent = \"This text was added to the iframe by the host app\";" +
"document.body.appendChild(content);");
};
}
Обзор справочника по API
Следующие функции, перечисленные в разделе Обзор функций и API WebView2, включают API, связанные с кадрами:
- Общий доступ к объектам узла или веб-сайта
- Iframes
- Выполнение скрипта
- Веб-обмен сообщениями
- Разрешения
- Блокировка нежелательного перехода
- События навигации
См. также
- Вызов собственного кода из веб-кода
- События навигации для приложений WebView2 допустимы как для кадров, так и для веб-страниц.
Внешние страницы: