QCefView实现与JS的交互

摘要:
Cef主动与JS通信的方式主要有一种:首先,QCefEventevent(constQString&eventName)//定义Cef事件setStringProperty(constQSString&key,constQString&msg);//为事件添加参数boardcastEvent(constQString&signalName,QCefEvent&event)/

Cef主动向JS通信主要有一种方法:
首先在Cef中

QCefEvent event ( const QString& eventName ); //定义一个CEF事件

event.setStringProperty ( const QString& key, const QString& msg ); //为事件添加参数

boardcastEvent ( const QString& signalName, QCefEvent& event ); //C++广播,其中signalName是与JS交互的标识

在JS中则需要添加一个监听事件

QCefClient.addEventListener (const QString& signalName, void* JSListener)

其中:

signalName:cef中传递的字符串标识
JSListener:JS中调用的函数地址
具体使用示例:

//C++
QCefEvent event("SendMsgToJSEvent");
event.setStringProperty("CppMsg", sMsg);
boardcastEvent("JsRecvCppTest", event);
//JS
QCefClient.addEventListener( "JsRecvCppTest", function onColorChanged (event){
document.getElementById("main").style.backgroundColor = event["CppMsg"];
}
);
总结:

C++中定义一个CEF事件,boardcastEvent通过绑定标识广播事件;
JS中addEventListener绑定C++中的一个字符串标识和JS中的函数;
JS主动向Cef通信主要有两种方法:
(1)invokeMethod / onInvokeMethodNotify
在JS中

invokeMethod (const QString& method, const QVariantList &arguments)

其中:

method:JS定义的交互标识
arguments:JS传递的参数列表
在Cef中

QCefView::onInvokeMethodNotify (int browserId, int frameId, const QString &method, const QVariantList &arguments)

其中:

method:JS定义的交互标识,由Cef接收消息过滤后进行不同的响应
arguments:JS传递过来的参数列表
具体示例:

// JS
QCefClient.invokeMethod("TestMethod", 1, false, "arg3");
// C++
void CefView::onInvokeMethodNotify(int browserId,
int frameId,
const QString& method,
const QVariantList& arguments)
{
if (0 == method.compare("TestMethod"))
{
QString title("QCef InvokeMethod Notify");
QString qsArgument(arguments.last().value<QString>());
QString text = QString(
"Method: %1 "
"Arguments: %2")
.arg(method)
.arg(qsArgument);

QMessageBox::information(this->window(), title, text);
}
}
(2)onQCefQueryRequest
在JS中

JS使用QCefQuery发送请求:

var query = { request, onSuccess, onFailure}

其中:

request:JS发送的请求信息
onSuccess:Cef回复成功时调用
onFailure:Cef回复失败时调用
window.QCefQuery (query); //window为CefRefPtr<CefWindow>类型

在Cef中

onQCefQueryRequest (const QCefQuery &query) // 响应QCefQuery

具体示例:

// JS
var query = {
request: "getUserInfo",
onSuccess: function (response) { alert (response); },
onFailure: function (error_code, error_message) { alert (error_message); }
}
window.QCefQuery(query);
void QCefView::onQCefQueryRequest(const QCefQuery &query)
{
if ("getUserInfo" == query.request()) // 根据JS的request筛选
{
QString response = QString("Accept a piece of information from JS: %1")
.arg(query.request());

//设置回复信息, 其中true则回传成功,JS将调用onSuccess,false则调用onFailure
query.setResponseResult (true, response);
}
responseQCefQuery (query); //回传信息
}
总结:

invokeMethod方式是JS将信息发送给了Cef,但是没有回传信息;而onQCefQueryRequest则接收到JS的信息后回复;
客户端通过token加载线上页面时则可以通过onQCefQueryRequest实现,在加载时向Cef请求token等信息,然后客户端回传所需信息,实现账号登陆等操作;
QCefView中通过消息循环和事件过滤来实现信息的传递,通过继承QCefView重写相应的方法可以实现Qt和JS之间的通信,在JS的本地路径或是url作为参数传递给QCefView的构造函数实现两者之间的绑定。其它的通信方式在项目的实际开发中使用较少,这里就没有介绍了
————————————————
版权声明:本文为CSDN博主「MoreThinker」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_39071305/article/details/117151582

免责声明:文章转载自《QCefView实现与JS的交互》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何创建Debian二进制包(译)Arcface人脸识别SDK(java+linux/window) 初试下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

js之split()和join()的用法

说明 这几天写了一个简单的vue项目,需要截取字符串,一时间想到了正则表达式,还折腾了还一会儿,最后上网查了一下,使用split()再简单不过了,也顺便回忆一下join()。可见我有多菜,哈哈,学了这么久,竟然对它们这么陌生。 split(separator,howmany) 说明:可以把某个字符串str按某个字符(separator)分割成多个字符串...

jquery/js记录点击事件,单击次数加一,双击清零

目的:点击按钮,点击后在网页上显示点击次数,双击清零 实现:js或者jquery 代码如下: <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE HTML> <html&g...

[阮一峰]Linux 守护进程的启动方法

"守护进程"(daemon)就是一直在后台运行的进程(daemon)。 本文介绍如何将一个 Web 应用,启动为守护进程。 一、问题的由来 Web应用写好后,下一件事就是启动,让它一直在后台运行。 这并不容易。举例来说,下面是一个最简单的Node应用server.js,只有6行。 var http = require('http'); http...

Android开发中java与javascript交互:PhoneGap插件vs addJavascriptInterface

1.前言 在《用PhoneGap+jQueryMobile开发Android应用实例》中,我们讲到PhoneGap(以下称Cordova)开发环境的搭建,以及如何整合出一个基本的Android应用框架(并给出了范例代码)。于是乎,我们便开始日夜兼程,披星戴月的炮制我们的第一个手机应用了。 但实际上,除了常见的API调用规范(有且仅有自查手册一途)引起的问题...

cloudevents 学习二 java 代码集成试用

主要是测试cloudevents 与java 的集成(client 使用nodejs) nodejs client const axios = require("axios").default; const { emitterFor, Mode, HTTP,CloudEvent } = require("cloudevents"); const type...

HTML5触屏版多线程渲染模板技术分享

  前言: 了解js编译原理的屌丝们都知道,js是单线程的,想当年各路神仙为了实现js的多线程,为了解决innerHTML输出大段HTML卡页面的顽疾,纷纷设计了诸如假冒的“多线程“实现,我自己也在写开源框架KitJs时候,写过类似的组件http://www.cnblogs.com/xueduanyang/archive/2012/05/30/252642...