如何使用 WebView2 打开内存中的网页?
How to open an in-memory web page with WebView2?
我的 C++ 代码有这些步骤,试图获得 JavaScript 生成的 HTML 代码。
- 调用
ICoreWebView2Settings::put_IsScriptEnabled
开启 JavaScript 功能
- 调用
ICoreWebView2::NavigateToString
设置内存网页。
- 当
NavigationCompleted
发生时,我们收获了整个网页的HTML代码。
不幸的是,显然存在竞争条件。有时,<body>
中的JavaScript代码会被忽略,只有<head>
中的JavaScript代码有效。有时,我们得到 <html><head></head><body></body></html>
.
使用ICoreWebView2::Navigate
打开远程网页时,我没有看到这个问题。这似乎是 ICoreWebView2::NavigateToString
中的错误。因此,将ICoreWebView2::NavigateToString
替换为ICoreWebView2::Navigate
似乎是更好的选择,但我不知道如何使用ICoreWebView2::Navigate
打开内存中的HTML文档。我应该使用什么方案? file://
或 memory://
等?有什么建议吗?谢谢。
我认为你可以在 ICoreWebView2::Navigate
中使用 Data URLs。数据 URL 以 data:
方案开头,您可以使用 data:text/html,
来显示 HTML 内容。您可以参考下面的示例代码:
webviewWindow->Navigate(L"data:text/html,<h1>Hello, World!</h1> <script>alert('hi');</script>");
上面的代码将显示一个带有“Hello, World!”的 HTML 文档。并执行 JavaScript 警报。
我尝试了很多方法来获得 JavaScript-rendered 代码,我得到的最好的方法是:
调用 ICoreWebView2::AddWebResourceRequestedFilter
和 ICoreWebView2::add_WebResourceRequested
启用伪 URI,例如“文件://in-mem/doc”。
事件回调中WebResourceRequested
,
调用 ICoreWebView2WebResourceRequestedEventArgs::get_ResourceContext
获取请求。
调用 ICoreWebView2Environment::CreateWebResourceResponse
创建响应。
在回调的参数上调用 ICoreWebView2WebResourceRequestedEventArgs::put_Response
。
在事件NavigationCompleted
的回调中,我们收获了JavaScript-renderedHTML代码。
我的 C++ 代码有这些步骤,试图获得 JavaScript 生成的 HTML 代码。
- 调用
ICoreWebView2Settings::put_IsScriptEnabled
开启 JavaScript 功能 - 调用
ICoreWebView2::NavigateToString
设置内存网页。 - 当
NavigationCompleted
发生时,我们收获了整个网页的HTML代码。
不幸的是,显然存在竞争条件。有时,<body>
中的JavaScript代码会被忽略,只有<head>
中的JavaScript代码有效。有时,我们得到 <html><head></head><body></body></html>
.
使用ICoreWebView2::Navigate
打开远程网页时,我没有看到这个问题。这似乎是 ICoreWebView2::NavigateToString
中的错误。因此,将ICoreWebView2::NavigateToString
替换为ICoreWebView2::Navigate
似乎是更好的选择,但我不知道如何使用ICoreWebView2::Navigate
打开内存中的HTML文档。我应该使用什么方案? file://
或 memory://
等?有什么建议吗?谢谢。
我认为你可以在 ICoreWebView2::Navigate
中使用 Data URLs。数据 URL 以 data:
方案开头,您可以使用 data:text/html,
来显示 HTML 内容。您可以参考下面的示例代码:
webviewWindow->Navigate(L"data:text/html,<h1>Hello, World!</h1> <script>alert('hi');</script>");
上面的代码将显示一个带有“Hello, World!”的 HTML 文档。并执行 JavaScript 警报。
我尝试了很多方法来获得 JavaScript-rendered 代码,我得到的最好的方法是:
调用
ICoreWebView2::AddWebResourceRequestedFilter
和ICoreWebView2::add_WebResourceRequested
启用伪 URI,例如“文件://in-mem/doc”。事件回调中
WebResourceRequested
,调用
ICoreWebView2WebResourceRequestedEventArgs::get_ResourceContext
获取请求。调用
ICoreWebView2Environment::CreateWebResourceResponse
创建响应。在回调的参数上调用
ICoreWebView2WebResourceRequestedEventArgs::put_Response
。
在事件
NavigationCompleted
的回调中,我们收获了JavaScript-renderedHTML代码。