Appearance
页面操作相关
注意
由于当前网页异步或单页面内容较多,部分页面操作需要合适的时机,可以参考生命周期回调索引,如果接口不能保证内容的存在,需要使用 JS 等其它方法准确判断时机。
获取页面 HTML 源代码
cpp
mbOnDocumentReady(mbView, onDocumentReady, nullptr);
cpp
void MB_CALL_TYPE onGetSource(mbWebView webView, void* param, const utf8* mhtml)
{
// mhtml 就是 HTML 源代码
}
void MB_CALL_TYPE onDocumentReady(mbWebView webView, void* param, mbWebFrameHandle frameId)
{
if (mbIsMainFrame(webView, frameId)) {
mbGetSource(webView, onGetSource, nullptr);
}
}
mbGetSource
用来获取网页 HTML 源码,结果在回调中获取。
mbOnDocumentReady
触发的时机只是页面 HTML 骨架加载完成,注意图片、视频、ajax 等大概率没有完成。
将网页导出为 MB 格式的 HTML
cpp
mbOnDocumentReady(mbView, onDocumentReady, nullptr);
cpp
void MB_CALL_TYPE onGetSource(mbWebView webView, void* param, const utf8* mhtml)
{
// mhtml 就是 MB 格式的 HTML 源代码
}
void MB_CALL_TYPE onDocumentReady(mbWebView webView, void* param, mbWebFrameHandle frameId)
{
if (mbIsMainFrame(webView, frameId)) {
mbUtilSerializeToMHTML(webView, onGetSource, nullptr);
}
}
onGetSource
是获取 HTML 源代码,mbUtilSerializeToMHTML
获取的是添加了 MB 相关信息的源代码。
页面 frame 相关
判断是否是页面的主 frame:
cpp
mbIsMainFrame(webView, frameId);
获取页面主 frame 的 ID
cpp
mbWebFrameGetMainFrame(webView);
在页面执行 JS
使用 mbRunJs
,案例见 如何在页面上执行自己的 JS。
如何获取 JS 执行结果,也参考上面的案例。
参数中的 isInClosure
为指定是否闭包执行,即MB会将js代码放入一个function(){ script }中执行,此时 script 代码中如果含有大括号字符,请转义,否则会运行出错。
JS 类型转为 C++ 类型可以使用:
mbJsToDouble
mbJsToBoolean
mbJsToString
获取 JS 类型使用 mbGetJsValueType。
JS 与 C++ 互传结构体可以使用 JSON 字符串。
在页面执行 HTML
cpp
mbOnDocumentReady(mbView, onDocumentReady, nullptr);
cpp
void MB_CALL_TYPE onDocumentReady(mbWebView webView, void* param, mbWebFrameHandle frameId)
{
if (mbIsMainFrame(webView, frameId)) {
mbLoadHtmlWithBaseUrl(webView, "<h1>new Title</h1>", "");
}
}
使用 mbLoadHtmlWithBaseUrl
在页面加载一段 HTML,如果代码里有相对路径的文件操作,baseUrl可以指定代码中的相对目录,""
则为当前目录。
TIP
如果原来有 HTML,会全部顶掉,上面的代码演示了这一点。
加载 URL
cpp
mbLoadURL(mbView, "https://miniblink.net/mb/api%e6%96%87%e6%a1%a3/");
支持网络协议路径如 https://miniblink.net
和本地文件协议路径如file:///C:/xx/xx.html
,不支持 JS 如javascript:alert(1)
,注意协议尽量写全。
新建窗口问题
页面新建窗口,如<a target="_blank" href="https://xx/">xx</a>
,或者使用 window.open()
,可以使用 mbOnCreateView
注册回调拦截。
cpp
mbOnCreateView(mbView, onCreateView, (void*)mbView);
cpp
mbWebView MB_CALL_TYPE onCreateView(mbWebView webView, void* param, mbNavigationType navigationType, const utf8* url, const mbWindowFeatures* windowFeatures)
{
mbWebView view = mbCreateWebView();
// do something
return view;
}
右键菜单相关
右键菜单默认开始,关闭使用 mbSetContextMenuEnabled
设置。 修改菜单内容使用 mbSetContextMenuItemShow
,如下面开启右键复制选项,全部选项查看 mbSetContextMenuItemShow
cpp
mbSetContextMenuItemShow(mbView, kMbMenuCutId, true);
获取页面标题
使用 mbGetTitle
(不太推荐):
cpp
mbOnDocumentReady(mbView, onDocumentReady, nullptr);
cpp
void MB_CALL_TYPE onDocumentReady(mbWebView webView, void* param, mbWebFrameHandle frameId)
{
if (mbIsMainFrame(webView, frameId)) {
std::string titleStr = mbGetTitle(webView);
// do something
}
}
使用 mbOnTitlmbOnTitleChanged
:
cpp
mbOnTitlmbOnTitleChanged(mbView, onTitleChanged, nullptr);eChanged
cpp
static void MB_CALL_TYPE onTitleChanged(mbWebView webView, void* param, const utf8* title)
{
std::string titleStr = title;
// do something
}
获取页面 URL
使用 mbGetUrl
(不太推荐):
cpp
mbOnDocumentReady(mbView, onDocumentReady, nullptr);
cpp
void MB_CALL_TYPE onDocumentReady(mbWebView webView, void* param, mbWebFrameHandle frameId)
{
if (mbIsMainFrame(webView, frameId)) {
std::string urlStr = mbGetUrl(webView);
// do something
}
}
使用 mbOnURLChanged
:
cpp
mbOnURLChanged(mbView, onURLChanged, nullptr);
cpp
static void MB_CALL_TYPE onURLChanged(mbWebView webView, void* param, const utf8* url, BOOL canGoBack, BOOL canGoForward)
{
std::string urlStr = url;
// do something
}
页面前进/后退/停止加载/重新加载
cpp
mbGoBack(mbView);
mbGoForward(mbView);
mbStopLoading(mbView);
mbReload(mbView);
重新加载将去除缓存,从服务器重新拉取数据。
如果想要控制页面是否可以前进,可以使用 mbCanGoForward;要控制页面是否可以后退,可以使用 mbCanGoBack
页面关闭/销毁回调
mbOnClose
注册页面关闭时的回调,回调函数返回 false
则取消关闭操作:
cpp
mbOnClose(mbView, onClose, nullptr);
cpp
static BOOL MB_CALL_TYPE onClose(mbWebView webView, void* param, void* unuse)
{
return true;
}
mbOnDestroy
注册页面销毁时的回调,无法取消:
cpp
mbOnDestroy(mbView, onDestroy, nullptr);
cpp
static BOOL MB_CALL_TYPE onDestroy(mbWebView webView, void* param, void* unuse)
{
return false;
}
设置 UA
cpp
mbSetUserAgent(mbView, "Mozilla/5.0 My UA");
设置 UA,注意是全局生效,也就是不只是传入的 mbView 而是所有的 mbView 都生效。
获得和设置页面缩放系数
cpp
float zoomFactor = mbGetZoomFactor(mbView);
mbSetZoomFactor(mbView, 3.0);
导航到新页面回调
cpp
mbOnNavigation(mbView, onNavigation, nullptr);
cpp
BOOL MB_CALL_TYPE onNavigation(mbWebView webView, void* param, mbNavigationType navigationType, const utf8* url)
{
return true;
}
mbNavigationType
表示导航的类型,详情参考 mbOnNavigation。
返回 true 表示允许继续,返回 false 表示终止继续。
设置是否显示窗口
cpp
mbShowWindow(mbView, TRUE);
设置焦点和取消焦点
cpp
mbOnDocumentReady(mbView, onDocumentReady, nullptr);
cpp
void MB_CALL_TYPE onDocumentReady(mbWebView webView, void* param, mbWebFrameHandle frameId)
{
if (mbIsMainFrame(webView, frameId)) {
mbSetFocus(webView);
}
}
这里设置了当页面 document ready 时获取焦点.
取消焦点使用 mbKillFocus。
唤醒指定的 webView
cpp
mbWake(webView);
获取 DC 锁和解锁
cpp
mbGetLockedViewDC(webView);
mbUnlockViewDC(webView);