查看源代码 wxWebView (wx v2.4.3)
此控件可用于渲染 Web (HTML / CSS / javascript) 文档。
它旨在允许为每个端口创建多个后端,尽管目前只有一个可用。它与 wxHtmlWindow
的不同之处在于,每个后端实际上是一个完整的渲染引擎,MSW 上使用 Trident,macOS 和 GTK 上使用 Webkit。这允许正确查看带有 javascript 和 css 的复杂页面。
后端描述
Par
IE 后端使用 Microsoft 的 Trident 渲染引擎,特别是本地安装的 Internet Explorer 副本所使用的版本。因此,它仅适用于 MSW 端口。默认情况下,此后端使用的 WebBrowser 控件的最新版本会模拟 Internet Explorer 7。可以使用注册表设置 wxWebView::MSWSetEmulationLevel() 更改此设置,有关更多信息,请参阅此文章。此后端完全支持自定义方案和虚拟文件系统。
Par
Edge (Chromium) 后端使用 Microsoft 的 Edge WebView2。它适用于 Windows 7 及更高版本。此后端当前不支持以下功能:虚拟文件系统、自定义 URL、查找。
默认情况下不启用此后端,要构建它,请按照以下步骤操作
需要 Visual Studio 2015 或更高版本
下载 WebView2 SDK nuget 包(版本 0.9.488 或更高版本)
将包(它是一个 zip 存档)解压到
wxWidgets/3rdparty/webview2
(解压后,您应该有3rdparty/webview2/build/native/include/WebView2.h
文件)在 CMake 或
setup.h
中启用wxUSE_WEBVIEW_EDGE
构建 wxWidgets webview 库
将
WebView2Loader.dll
从wxWidgets/3rdparty/webview2/build/
的与使用的架构(x86 或 x64)对应的子目录复制到您的应用程序可执行文件在运行时,您可以使用
isBackendAvailable/1
来检查是否可以使用后端(如果可以加载WebView2Loader.dll
并且安装了 Edge (Chromium) ,它将可用)请务必按照其许可的要求,在应用程序文档中添加有关使用 WebView2 SDK 的说明
Par
在 GTK 下,WebKit 后端使用 WebKitGTK+。当前所需的最低版本是 1.3.1,该版本默认随 Ubuntu Natty 和 Debian Wheezy 一起提供,并且软件包名称为 libwebkitgtk-dev。此后端支持自定义方案和虚拟文件系统,但是嵌入式资源(例如图像和样式表)当前使用 data:// 方案加载。
Par
在 GTK3 下,使用 WebKitGTK+ 的 WebKit2 版本。在 Ubuntu 中,所需的软件包名称是 libwebkit2gtk-4.0-dev,在 Fedora 中是 webkitgtk4-devel。除清除和启用/禁用历史记录外,支持所有 wxWEBVIEW_WEBKIT 功能。
Par
macOS WebKit 后端使用 Apple 的 WebView 类。此后端完全支持自定义方案和虚拟文件系统。
异步通知
wxWebView
中的许多方法都是异步的,即它们立即返回并在后台执行其工作。这包括 loadURL/2
和 reload/2
等函数。要接收这些函数的进度和完成通知,您需要处理提供的事件。具体来说,wxEVT_WEBVIEW_LOADED
会在页面或子框架完成加载时发出通知,而 wxEVT_WEBVIEW_ERROR
会在发生错误时发出通知。
虚拟文件系统和自定义方案
wxWebView
支持注册自定义方案处理程序,例如 file
或 http
。为此,创建一个从 wxWebViewHandler
继承的新类(未在 wx 中实现),其中 wxWebHandler::GetFile() 返回一个指向 wxFSFile
(未在 wx 中实现)的指针,该指针表示给定的 URL。然后,您可以使用 RegisterHandler()
(未在 wx 中实现)注册您的处理程序,它将被调用来处理所有页面和资源。
提供了 wxWebViewFSHandler
(未在 wx 中实现)来访问由 wxFileSystem
(未在 wx 中实现)封装的虚拟文件系统。wxMemoryFSHandler
(未在 wx 中实现)文档给出了如何使用它的示例。
提供了 wxWebViewArchiveHandler
(未在 wx 中实现)以允许浏览 zip 存档中的页面。它支持以下形式的路径:scheme:///C
:/example/docs.zip;protocol=zip/main.htm
此类派生自以下类,并且可以使用以下类中的函数:
wxWidgets 文档: wxWebView
事件
从此类发出的事件类型
摘要
函数
如果可以复制当前选择,则返回 true。
如果可以剪切当前选择,则返回 true。
如果可以在访问页面的历史记录中向后导航,则返回 true。
如果可以在访问页面的历史记录中向前导航,则返回 true。
如果可以粘贴数据,则返回 true。
如果存在要重做的操作,则返回 true。
检索当前 HTML 引擎是否支持缩放类型。
如果存在要撤消的操作,则返回 true。
清除历史记录,这也会删除可见页面。
清除当前选择。
复制当前选择。
剪切当前选择。
删除当前选择。
启用或禁用右键单击上下文菜单。
启用或禁用历史记录。
在当前页面上查找短语,如果找到,控件会将短语滚动到视图中并将其选中。
获取当前网页的标题,如果标题不可用,则获取其 URL/路径。
获取当前显示文档的 URL。
获取当前显示文档的 HTML 源代码。
获取当前页面的文本。
返回当前选定的源代码(如果有)。
返回当前选定的文本(如果有)。
获取页面的缩放级别。
获取页面的缩放因子。
获取当前如何解释缩放因子。
在访问页面的历史记录中向后导航。
在访问页面的历史记录中向前导航。
如果存在当前选择,则返回 true。
允许检查当前是否可以使用特定的后端。
返回 Web 控件当前是否忙碌(例如,加载页面)。
如果右键单击时将显示上下文菜单,则返回 true。
返回 Web 控件当前是否可编辑。
从 URL 加载网页。
粘贴当前数据。
打开打印对话框,以便用户可以打印当前显示的页面。
重做最后一个操作。
重新加载当前显示的 URL。
运行给定的 JavaScript 代码。
选择整个页面。
设置 Web 控件的可编辑属性。
将显示的页面源代码设置为给定字符串的内容。
设置页面的缩放级别。
设置页面的缩放因子。
设置如何解释缩放因子。
停止当前页面加载过程(如果有)。
撤销上一个操作。
类型
-type wxWebView() :: wx:wx_object().
函数
如果可以复制当前选择,则返回 true。
注意:在 macOS WebKit 后端上,此函数始终返回 true
。
如果可以剪切当前选择,则返回 true。
注意:在 macOS WebKit 后端上,此函数始终返回 true
。
如果可以在访问页面的历史记录中向后导航,则返回 true。
如果可以在访问页面的历史记录中向前导航,则返回 true。
如果可以粘贴数据,则返回 true。
注意:在 macOS WebKit 后端上,此函数始终返回 true
。
如果存在要重做的操作,则返回 true。
-spec canSetZoomType(This, Type) -> boolean() when This :: wxWebView(), Type :: wx:wx_enum().
检索当前 HTML 引擎是否支持缩放类型。
返回:此 HTML 引擎是否支持此类型的缩放(因此可以通过 setZoomType/2
设置)。
如果存在要撤消的操作,则返回 true。
-spec clearHistory(This) -> ok when This :: wxWebView().
清除历史记录,这也会删除可见页面。
注意:此功能未在 WebKit2GTK+ 后端上实现。
-spec clearSelection(This) -> ok when This :: wxWebView().
清除当前选择。
-spec copy(This) -> ok when This :: wxWebView().
复制当前选择。
-spec cut(This) -> ok when This :: wxWebView().
剪切当前选择。
-spec deleteSelection(This) -> ok when This :: wxWebView().
删除当前选择。
请注意,对于 wxWEBVIEW_BACKEND_WEBKIT
,必须通过 SetEditable 或正确的 HTML 属性使选择可编辑。
-spec enableContextMenu(This) -> ok when This :: wxWebView().
-spec enableContextMenu(This, [Option]) -> ok when This :: wxWebView(), Option :: {enable, boolean()}.
启用或禁用右键单击上下文菜单。
默认情况下,标准上下文菜单已启用,此方法可用于禁用或稍后重新启用它。
起始版本:2.9.5
-spec enableHistory(This) -> ok when This :: wxWebView().
启用或禁用历史记录。
这也会清除历史记录。
注意:此功能未在 WebKit2GTK+ 后端上实现。
-spec find(This, Text) -> integer() when This :: wxWebView(), Text :: unicode:chardata().
等效于 find(This, Text, [])
。
-spec find(This, Text, [Option]) -> integer() when This :: wxWebView(), Text :: unicode:chardata(), Option :: {flags, wx:wx_enum()}.
在当前页面上查找短语,如果找到,控件会将短语滚动到视图中并将其选中。
返回:如果未找到与标志组合的搜索词组,则返回 wxNOT_FOUND
。如果首次使用搜索词组调用,则返回结果总数。然后,每次使用相同的搜索词组调用时,它将返回当前匹配的编号。
注意:如果标志 wxWEBVIEW_FIND_ENTIRE_WORD
或 wxWEBVIEW_FIND_MATCH_CASE
发生更改,此函数将重新启动搜索,因为这将需要新的搜索。要重置搜索,例如重置突出显示,请使用空搜索词组调用该函数。在 macOS WebKit 后端上,此函数始终返回 wxNOT_FOUND
。
起始版本:2.9.5
-spec getCurrentTitle(This) -> unicode:charlist() when This :: wxWebView().
获取当前网页的标题,如果标题不可用,则获取其 URL/路径。
-spec getCurrentURL(This) -> unicode:charlist() when This :: wxWebView().
获取当前显示文档的 URL。
-spec getPageSource(This) -> unicode:charlist() when This :: wxWebView().
获取当前显示文档的 HTML 源代码。
返回:HTML 源代码,如果当前未显示任何页面,则返回空字符串。
-spec getPageText(This) -> unicode:charlist() when This :: wxWebView().
获取当前页面的文本。
-spec getSelectedSource(This) -> unicode:charlist() when This :: wxWebView().
返回当前选定的源代码(如果有)。
-spec getSelectedText(This) -> unicode:charlist() when This :: wxWebView().
返回当前选定的文本(如果有)。
-spec getZoom(This) -> wx:wx_enum() when This :: wxWebView().
获取页面的缩放级别。
请参阅 getZoomFactor/1
以获取比 wxWebViewZoom
提供的更精确的缩放比例值。
返回:当前的缩放级别。
获取页面的缩放因子。
返回:当前的缩放因子。
起始版本:3.1.4
-spec getZoomType(This) -> wx:wx_enum() when This :: wxWebView().
获取当前如何解释缩放因子。
返回:HTML 引擎当前如何解释缩放因子。
-spec goBack(This) -> ok when This :: wxWebView().
在访问页面的历史记录中向后导航。
仅当 canGoBack/1
返回 true 时才有效。
-spec goForward(This) -> ok when This :: wxWebView().
在访问页面的历史记录中向前导航。
仅当 canGoForward/1
返回 true 时才有效。
如果存在当前选择,则返回 true。
-spec isBackendAvailable(Backend) -> boolean() when Backend :: unicode:chardata().
允许检查当前是否可以使用特定的后端。
起始版本:3.1.4
返回 Web 控件当前是否忙碌(例如,加载页面)。
如果右键单击时将显示上下文菜单,则返回 true。
起始版本:2.9.5
返回 Web 控件当前是否可编辑。
-spec loadURL(This, Url) -> ok when This :: wxWebView(), Url :: unicode:chardata().
从 URL 加载网页。
注意:Web 引擎通常会异步报告错误,因此如果您想知道 URL 加载是否成功,请注册以接收导航错误事件。
-spec new(Parent, Id) -> wxWebView() when Parent :: wxWindow:wxWindow(), Id :: integer().
等效于 new(Parent, Id, [])
。
-spec new(Parent, Id, [Option]) -> wxWebView() when Parent :: wxWindow:wxWindow(), Id :: integer(), Option :: {url, unicode:chardata()} | {pos, {X :: integer(), Y :: integer()}} | {size, {W :: integer(), H :: integer()}} | {backend, unicode:chardata()} | {style, integer()}.
工厂函数,用于使用 wxWebViewFactory
(未在 wx 中实现)创建新的 wxWebView
。
返回:创建的 wxWebView
,如果请求的后端不可用,则返回 NULL
。
起始版本:2.9.5
-spec paste(This) -> ok when This :: wxWebView().
粘贴当前数据。
-spec print(This) -> ok when This :: wxWebView().
打开打印对话框,以便用户可以打印当前显示的页面。
-spec redo(This) -> ok when This :: wxWebView().
重做最后一个操作。
-spec reload(This) -> ok when This :: wxWebView().
等效于 reload(This, [])
。
-spec reload(This, [Option]) -> ok when This :: wxWebView(), Option :: {flags, wx:wx_enum()}.
重新加载当前显示的 URL。
注意:edge 后端会忽略这些标志。
-spec runScript(This, Javascript) -> Result when Result :: {Res :: boolean(), Output :: unicode:charlist()}, This :: wxWebView(), Javascript :: unicode:chardata().
运行给定的 JavaScript 代码。
JavaScript 代码在浏览器控件内执行,并且可以完全访问 DOM 和其他浏览器提供的功能。例如,此代码会将当前页面内容替换为提供的字符串。
如果 output
不为 null,则成功执行此代码后,会使用结果填充它,例如 JavaScript 值(如字符串、数字(整数或浮点数)、布尔值或非原始类型(如数组和对象)的 JSON 表示形式)。例如
此函数有一些特定于平台的限制
在 wxGTK2 中使用 WebKit v1 时,不支持检索 JavaScript 执行的结果,如果
output
不为 null,此函数将始终返回 false 以指示这一点。当在 wxGTK3 中使用 WebKit v2 或更高版本时,此功能完全支持。在 macOS 下使用 WebKit 时,代码执行限制为最多 10MiB 的内存和 10 秒的执行时间。
在 MSW 下使用 IE 后端时,只有在当前页面完全加载后才能执行脚本(即收到
wxEVT_WEBVIEW_LOADED
事件)。为了运行 JavaScript,需要在页面 HTML 中包含一个 script 标签。
还要注意,在 MSW 下,默认仿真模式不支持将 JavaScript 对象转换为 JSON。wxWebView
实现了自己的对象到 JSON 的转换作为这种情况的后备,但是它不如浏览器控件本身中此功能的实现那么功能齐全、经过良好测试或性能良好,因此建议使用 MSWSetEmulationLevel() 将仿真级别更改为更现代的级别,在该级别中由控件本身完成 JSON 转换。
返回:如果存在结果,则为 true;如果存在错误,则为 false。
-spec selectAll(This) -> ok when This :: wxWebView().
选择整个页面。
-spec setEditable(This) -> ok when This :: wxWebView().
设置 Web 控件的可编辑属性。
即使未设置 contenteditable
属性,启用后也允许用户编辑页面。确切的功能因使用的后端而异。
-spec setPage(This, Html, BaseUrl) -> ok when This :: wxWebView(), Html :: unicode:chardata(), BaseUrl :: unicode:chardata().
将显示的页面源代码设置为给定字符串的内容。
注意:当使用 wxWEBVIEW_BACKEND_IE
时,必须等待当前页面加载完成后才能调用 setPage/3
。在此后端和 edge 后端中,不使用 baseURL 参数。
-spec setZoom(This, Zoom) -> ok when This :: wxWebView(), Zoom :: wx:wx_enum().
设置页面的缩放级别。
请参阅 setZoomFactor/2
以获取比 wxWebViewZoom
提供的测量步骤更精确的缩放比例。
设置页面的缩放因子。
注意:对于 wxWEBVIEW_ZOOM_TYPE_TEXT
的 wxWebViewZoomType
,IE 中的缩放比例将转换为 wxWebViewZoom
级别。
起始版本:3.1.4
-spec setZoomType(This, ZoomType) -> ok when This :: wxWebView(), ZoomType :: wx:wx_enum().
设置如何解释缩放因子。
注意:请先调用 canSetZoomType/2
,某些 HTML 渲染器可能不支持所有缩放类型。
-spec stop(This) -> ok when This :: wxWebView().
停止当前页面加载过程(如果有)。
可能会触发 wxWEBVIEW_NAV_ERR_USER_CANCELLED
类型的错误事件。待办事项:使 wxWEBVIEW_NAV_ERR_USER_CANCELLED
错误在各个端口之间保持一致。
-spec undo(This) -> ok when This :: wxWebView().
撤销上一个操作。