这里补充一点,关于cef控件调用原生的JS函数,看了下 cef_control_base.h 这个头文件,发现关于调用JS的方式 这里只是描述直接 调用一个前端注册好的函数,那么调用普通的JS函数该如何实现,这是这篇文章的主要重点;
参照:
https://www.cnblogs.com/chechen/p/6138167.html
根据这篇博客所描述
C++调用JS函数相对简单多了,因为CEF有接口可以直接使用CefFrame::ExecuteJavaScript,看看注释:
/// // Execute a string of JavaScript code in this frame. The |script_url| // parameter is the URL where the script in question can be found, if any. // The renderer may request this URL to show the developer the source of the // error. The |start_line| parameter is the base line number to use for error // reporting. /// /*--cef(optional_param=script_url)--*/ virtual void ExecuteJavaScript(const CefString& code, const CefString& script_url, int start_line) =0;
首先需要获取到我们的浏览器里的主框架对象,code是JS函数和传入参数的字符串,URL可以直接忽略。
CefRefPtr<CefFrame> frame = m_handler->GetBrowser()->GetMainFrame();
m_handler是我们自己定义的Handler对象
C++ 调用js方法
//frame->ExecuteJavaScript(L"Test();",frame->GetURL(),0);//提示框
//frame->ExecuteJavaScript(L"ModifyValue();",frame->GetURL(),0);//无参数函数
frame->ExecuteJavaScript(L"ModifyValue('巴萨牛逼');",frame->GetURL(),0);//有参数函数9 如果参数是可变的,可以这样
CString strJsCode;strJsCode.Format(L"setInstallStatus('%s','%s','%d');", lpData->strId.c_str(), strStatus, nPercent);
其中setInstallStatus是js函数,它有三个参数
根据博客内容可知 需要调用 ExecuteJavaScript 这个函数才行,那么如何调用这个 继续往下看:
总结上面的调用方式 就两行代码
CefRefPtr<CefFrame> frame = m_handler->GetBrowser()->GetMainFrame();
frame->ExecuteJavaScript(js函数的名字(),主界面的URL,JS函数调用的参数);
那么 这个m_handler 这个到底指的是什么;谁又可以调用GetBrowser()这个函数呢 搜索一下GetBrowser 这个函数 看包含在哪个类中 然后发现
void CefControlBase::LoadURL(const CefString& url)
{
if (browser_handler_.get() && browser_handler_->GetBrowser().get())
{
CefRefPtr<CefFrame> frame = browser_handler_->GetBrowser()->GetMainFrame();
if (!frame)
return;
frame->LoadURL(url);
}
else
{
if (browser_handler_.get())
{
StdClosure cb = ToWeakCallback([this, url]()
{
LoadURL(url);
});
browser_handler_->AddAfterCreateTask(cb);
}
}
}
随便找一个 CefControlBase类中实现的函数 都可以找到类似的调用方法 看browser_handler_的定义,发现 CefRefPtr<nim_comp::BrowserHandler> browser_handler_ = nullptr;
该成员变量就位于cef控件的基类中 也就是CefControlBase这个类中:
到这里 就可以直接套用上面的 调用方法,在CefControlBase这个类中 定义个函数 就叫
void CallJsFuction(const CefString& url);
实现:
void CefControlBase::CallJsFuction(const CefString& url)
{
CefRefPtr<CefFrame> frame = browser_handler_->GetBrowser()->GetMainFrame();
frame->ExecuteJavaScript(url, frame->GetURL(), 0);
}
这样就完成了使用nim_duilib中的cef控件调用JS方法的过程;不熟悉cef的同学 可以直接套用;