在nim_duilib中使用cef控件知识点

这里补充一点,关于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的同学 可以直接套用;

Guess you like

Origin blog.csdn.net/Wuzm_/article/details/119678795