gpt4 book ai didi

javascript - Chromium Embedded 如何从 C++ 执行 javascript 回调?

转载 作者:太空狗 更新时间:2023-10-29 23:15:22 25 4
gpt4 key购买 nike

最近我一直在尝试将我的应用程序绑定(bind)到 CEF,过程很慢,但我在过去几天取得了一些进展。但是,有一件事我无法开始工作。

我想实现的是: 1. 在 Javascript 中注册回调函数(当我的应用程序发生事件时将调用这些函数) 2. 保存回调。 3. 当事件发生时,执行注册的回调。

现在我可以执行第 1 步和第 2 步,但问题出在第 3 步。我首先通过注册回调然后使用 Javascript 中的 executeCallback() 函数调用它来测试它并且它有效。但每当我尝试从 C++ 中执行回调时,它都不起作用。

我在 onContextCread() 中创建了 setEventCallback

CefRefPtr<CefV8Value> object = context->GetGlobal();
CefRefPtr<CefV8Value> simplixObj = CefV8Value::CreateObject(NULL);
object->SetValue("simplix", simplixObj, V8_PROPERTY_ATTRIBUTE_NONE);
func = CefV8Value::CreateFunction("setEventCallback", $simplixHandler);
simplixObj->SetValue("setEventCallback", func, V8_PROPERTY_ATTRIBUTE_NONE);

$simplixHandler 是我自己的处理程序的一个实例。这是我的处理程序中的 setEventCallback:

bool SimplixHandler::setEventCallback(CefRefPtr<CefV8Value> object, const CefV8ValueList& arguments, CefRefPtr<CefV8Value>& retval, CefString& exception)
if (arguments.size() == 2 && arguments[0]->IsString() && arguments[1]->IsFunction()) {
//Get name of callback
std::string callbackName = arguments[0]->GetStringValue();
//Get the current context
CefRefPtr<CefV8Context> context = CefV8Context::GetCurrentContext();
//Insert into callbacks
$callbacks[callbackName] = std::make_pair(context, arguments[1]);

return true;
}
else if(arguments.size() != 2) {
exception = CefString("Invalid amount of parameters. Expected 2, received " + arguments.size());
return false;
}
else {
exception = CefString("Incompatible parameter types, expected (string, function).");
return false;
}

然后我尝试通过调用 executeCallback 来执行回调:

bool SimplixHandler::executeCallback(std::string name, CefRefPtr<CefListValue> list) {
bool handled = false;

if (!$callbacks.empty() && $callbacks.count(name) != 0) {
std::pair<CefRefPtr<CefV8Context>, CefRefPtr<CefV8Value>> pair = $callbacks[name];
CefRefPtr<CefV8Context> context = pair.first;
CefRefPtr<CefV8Value> func = pair.second;

context->Enter();
CefV8ValueList callArgs;

//First argument is function name
CefRefPtr<CefV8Value> args = CefV8Value::CreateArray(list->GetSize());
setList(list, args);
callArgs.push_back(args);

CefRefPtr<CefV8Value> retval = func->ExecuteFunction(NULL, callArgs);
if (retval.get()) {
if (retval->IsBool())
handled = retval->GetBoolValue();
}

context->Exit();
}

return handled;
}

我从我的 SimplixHandler 中调用这个函数,但是我通过调用特定的事件函数来调用回调,例如:

bool SimplixHandler::notifyDirectoryChanged(std::string directory) {
CefRefPtr<CefListValue> list = CefListValue::Create();

list->SetSize(1);
list->SetString(0, directory);

return executeCallback("onDirectoryChange", list);
}

最后是我的 Javascript:

function dirChange(dir) {
document.getElementById("filename").innerHTML = "It's something";
}

simplix.setEventCallback("onDirectoryChange", dirChange);

我知道事件被调用(因为我第一次遇到空指针异常是由于类的错误链接,现在已经修复),但是 Javascript 回调没有被调用。

有人知道我做错了什么吗?

提前致谢。

最佳答案

您可以使用html代码中的任何函数进行回调。

渲染器:

bool SimpleApp::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser,
CefProcessId source_process,
CefRefPtr<CefProcessMessage> message)
{
std::string message_name = message->GetName();

if( message_name == "FUNC")
{
//AfxMessageBox("stop");

//browser->GetMainFrame()->ExecuteJavaScript("super_test('works!');", browser->GetMainFrame()->->GetURL(), 0);

CefRefPtr<CefV8Value> object = m_context->GetGlobal();


CefRefPtr<CefV8Context> v8context = browser->GetMainFrame()->GetV8Context();
v8context->Enter();

CefRefPtr<CefV8Value> func_test = object->GetValue("super_test");

if(func_test == NULL)
{
v8context->Exit();
return false;
}

CefV8ValueList arguments;
CefRefPtr<CefV8Value> test = CefV8Value::CreateString("hello from c++");
arguments.push_back(test);

CefRefPtr<CefV8Value> retval = func_test->ExecuteFunction(NULL, arguments);

v8context->Exit();

return true;
}

return false;
}

脚本:

 <script>

function super_test(resp)
{
alert(resp);
return "7777";
}

浏览器:

CefRefPtr<CefProcessMessage> message = CefProcessMessage::Create("FUNC");

SimpleHandler::GetInstance()->GetBrowser()->SendProcessMessage(PID_RENDERER, message);

关于javascript - Chromium Embedded 如何从 C++ 执行 javascript 回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29645141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com