cheerp 使用事件的例子

简介: 这个文章主要描述在cheerp环境下, c++代码如何通过js包装使用dom事件 1 what?事件 事件作为js异步编程的核心,很好的把逻辑分散开来,形成各个处理的handler。 首先事件的目标和当前目标都是实现了派发接口的,可以响应事件并且可以添加事件监听处理的交互对象。

这个文章主要描述在cheerp环境下, c++代码如何通过js包装使用dom事件

1 what?事件

事件作为js异步编程的核心,很好的把逻辑分散开来,形成各个处理的handler。 首先事件的目标和当前目标都是实现了派发接口的,可以响应
事件并且可以添加事件监听处理的交互对象。
事件流拥有冒泡机制, 即从顶级元素流经目标元素并最终回到顶级元素,即所有的子元素都会作为事件流中的目标(target)来响应事件。

对于事件的应用,我想会有大量的文档在网络上,本文就不占篇幅了。
如果我们要使用cheerp平台做事件的派发和回调需要说明的内容就在这里了。

2事件的例子

在cheerp中注册一个最顶级的交互元素, 这个元素是window我们拥有window了以后可以拥有js端的玩法在c++端。

A. 首先我们先在js端实现一下浏览器端的事件定义,公开这些接口给cheerp。
cheerp定义:

Window * window_get_Window();
CustomEvent * window_getCustomEvent (const String & name);
CustomEvent * window_getCustomEvent (const String & name,  Object * param);

window_getCustomEvent用了overload技术来适应js,然后在js文件中公开这两个函数。ps:(为了简单我把这两个函数作为全局函数定义,其实可以定义在包里)

function window_get_Window () {
    return window;
}
function window_getCustomEvent(type, params) {
    return new CustomEvent(type, {detail:params});
}

B. 在cheerp端定义一个事件类型

 #define MY_EVENT_PUB "pub"

C.用cheerp编写一个简单的使用监听的生成js代码

   
 class [[cheerp::genericjs]] TestEvent {
 private :
static void MyEventPubHandler(Object *e) {
    console.log("i am catch this event");
}        
public:
TestEvent() {
}

static void init () {
    
    Window * window = window_get_Window();
    window->addEventListener(MY_EVENT_PUB, cheerp::Callback(MyEventPubHandler));
    
    Event  * event  = window_getCustomEvent(MY_EVENT_PUB, false);
    window->dispatchEvent(event);
}

};
D.在webMain入口中使用。

  void webMain () { //wasm 函数
      TestEvent::init();
  }

然后编写一个makefile 生成两个不同版本的放在浏览器里run。

    CHERRP_PATH=/cygdrive/c/cheerp/include
    SOURCE=main.cpp
    CHEERP_FLAG=-target cheerp -w
    WASMFLAGS=-cheerp-linear-heap-size=256 -cheerp-linear-heap-size=256 -cheerp-mode=wasm -cheerp-no-math-imul
    WASM_LOADER=-cheerp-wasm-loader=loader.js -cheerp-wasm-file=./build/test.wasm 
    CC=clang++
    DIST_JS=./build/test.js
    DIST_WASM=./build/test_wasm.wasm
    clear:
        @rm -f ./build/*
    
    test.wasm:
        $(CC) $(CHEERP_FLAG) $(WASMFLAGS) $(WASM_LOADER) -O3 -o $(DIST_WASM)  main.cpp 
    
    test.js:
        $(CC) $(CHEERP_FLAG) -O3 -o $(DIST_JS) main.cpp 
        cat head.js >> $(DIST_JS)
        
    all: clear  test.js test.wasm
        @echo "build done"

这样我们就可以拥有浏览器平台的事件流的能力了。

代码地址:git

相关文章
|
26天前
|
JavaScript 前端开发
js开发:请解释什么是事件委托(event delegation),并给出一个示例。
事件委托是JavaScript中优化事件处理的技术,通过绑定事件处理器到共享的父元素,利用事件冒泡机制来处理子元素的事件。这种方法能提升性能、简化代码并降低内存消耗。示例展示了如何在父元素上监听`click`事件,然后通过`event.target`识别触发事件的具体子元素(如`<li>`),实现对动态生成列表项的点击事件处理。
|
4月前
|
小程序
小程序封装组件简单案例,所有小程序适用(传入参数、外抛事件、传入样式)
小程序封装组件简单案例,所有小程序适用(传入参数、外抛事件、传入样式)
57 0
|
JavaScript 前端开发
如何找到一个前端事件对应的事件处理函数
如何找到一个前端事件对应的事件处理函数
312 0
如何找到一个前端事件对应的事件处理函数
|
API C#
艾伟_转载:把事件当作对象进行传递
  最近在琢磨一些事情,和API设计有关。API设计在很多时候是和语言特性有关的,因此如Java这样的语言,在API设计时会处处受到压抑。而C#就能够出现如Moq或Fluent NHIbernate这样的项目。
853 0
|
JavaScript 前端开发 数据安全/隐私保护
JavaScript之EventListener事件的传递顺序--冒泡和捕获传播
演示监听事件的传播顺序以及如何阻止这种传播。冒泡和捕获传播
1173 0
|
小程序
小程序 事件
 什么是事件 事件是视图层到逻辑层的通讯方式。 事件可以将用户的行为反馈到逻辑层进行处理。 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数。 事件对象可以携带额外信息,如 id, dataset, touches。
911 0
|
前端开发 小程序 数据格式
小程序学习---事件(二)
一、事件对象 如无特殊说明,当组件触发事件时,逻辑层绑定该事件的处理函数会收到一个事件对象。 1、BaseEvent 基础事件对象属性列表: 属性 类型 ...
1242 0
|
JavaScript
小程序学习---事件
一、什么是事件 1、事件是视图层到逻辑层的通讯方式。 2、事件可以将用户的行为反馈到逻辑层进行处理。 3、事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数。
1489 0