• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 通用事件
2<!--Kit: ArkUI-->
3<!--Subsystem: ArkUI-->
4<!--Owner: @jiangtao92-->
5<!--Designer: @piggyguy-->
6<!--Tester: @songyanhong-->
7<!--Adviser: @HelloCrease-->
8
9>  **说明:**
10>  从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
11
12## 事件说明
13
14- 事件绑定在组件上,当组件达到事件触发条件时,会执行JS中对应的事件回调函数,实现页面UI视图和页面JS逻辑层的交互。
15
16- 事件回调函数中通过参数可以携带额外的信息,如组件上的数据对象dataset,事件特有的回调参数。
17
18
19相对于私有事件,大部分组件都可以绑定如下事件。
20
21
22| 名称                     | 参数       | 描述                                                         | 是否支持冒泡                                          | 是否支持捕获    |
23| ------------------------ | ---------- | ------------------------------------------------------------ | ----------------------------------------------------- | --------------- |
24| touchstart               | TouchEvent | 手指刚触摸屏幕时触发该事件。TouchEvent具体可参考表2。       | 是<sup>5+</sup>                                       | 是<sup>5+</sup> |
25| touchmove                | TouchEvent | 手指触摸屏幕后移动时触发该事件。                             | 是<sup>5+</sup>                                       | 是<sup>5+</sup> |
26| touchcancel              | TouchEvent | 手指触摸屏幕中动作被打断时触发该事件。                       | 是<sup>5+</sup>                                       | 是<sup>5+</sup> |
27| touchend                 | TouchEvent | 手指触摸结束离开屏幕时触发该事件。                           | 是<sup>5+</sup>                                       | 是<sup>5+</sup> |
28| click                    | BaseEvent  | 点击动作触发该事件。                                         | 是<sup>6+</sup>                                       | 否              |
29| doubleclick<sup>7+</sup> | BaseEvent  | 双击动作触发该事件                                           | 否<br/> 从API&nbsp;Version&nbsp;9&nbsp;开始支持冒泡。 | 否              |
30| longpress                | BaseEvent  | 长按动作触发该事件。                                         | 否<br/>从API&nbsp;Version&nbsp;9&nbsp;开始支持冒泡。  | 否              |
31| swipe<sup>5+</sup>       | SwipeEvent | 组件上快速滑动后触发该事件。 SwipeEvent具体可参考表4 。      | 否<br/>从API&nbsp;Version&nbsp;9&nbsp;开始支持冒泡。  | 否              |
32| attached<sup>6+</sup>    | -          | 当前组件节点挂载在渲染树后触发。                             | 否                                                    | 否              |
33| detached<sup>6+</sup>    | -          | 当前组件节点从渲染树中移除后触发。                           | 否                                                    | 否              |
34| pinchstart<sup>7+</sup>  | PinchEvent | 手指开始执行捏合操作时触发该事件。<br/>PinchEvent具体可参考表5。 | 否                                                    | 否              |
35| pinchupdate<sup>7+</sup> | PinchEvent | 手指执行捏合操作过程中触发该事件。                           | 否                                                    | 否              |
36| pinchend<sup>7+</sup>    | PinchEvent | 手指捏合操作结束离开屏幕时触发该事件。                       | 否                                                    | 否              |
37| pinchcancel<sup>7+</sup> | PinchEvent | 手指捏合操作被打断时触发该事件。                             | 否                                                    | 否              |
38| dragstart<sup>7+</sup>   | DragEvent  | 用户开始拖拽时触发该事件。<br/>DragEvent具体可参考表6。      | 否                                                    | 否              |
39| drag<sup>7+</sup>        | DragEvent  | 拖拽过程中触发该事件。                                       | 否                                                    | 否              |
40| dragend<sup>7+</sup>     | DragEvent  | 用户拖拽完成后触发。                                         | 否                                                    | 否              |
41| dragenter<sup>7+</sup>   | DragEvent  | 进入释放目标时触发该事件。                                   | 否                                                    | 否              |
42| dragover<sup>7+</sup>    | DragEvent  | 在释放目标内拖动时触发。                                     | 否                                                    | 否              |
43| dragleave<sup>7+</sup>   | DragEvent  | 离开释放目标区域时触发。                                     | 否                                                    | 否              |
44| drop<sup>7+</sup>        | DragEvent  | 在可释放目标区域内释放时触发。                               | 否                                                    | 否              |
45
46
47>  **说明:**
48>  除上述事件外,其他事件均为非冒泡事件,如[input的change事件](js-components-basic-input.md#事件),详见各个组件。
49
50**表1** BaseEvent对象属性列表
51
52| 属性                  | 类型                   | 说明                                     |
53| --------------------- | ---------------------- | ---------------------------------------- |
54| type                  | string                 | 当前事件的类型,比如click、longpress等。 |
55| timestamp             | number                 | 该事件触发时的时间戳。                   |
56| deviceId<sup>8+</sup> | number                 | 触发该事件的设备ID信息。                 |
57| target<sup>12+</sup>   | [Target](#target对象6) | 触发该事件的目标对象。                   |
58
59**表2** TouchEvent对象属性列表(继承BaseEvent)
60
61| 属性             | 类型                     | 说明                                       |
62| -------------- | ---------------------- | ---------------------------------------- |
63| touches        | Array&lt;TouchInfo&gt; | 触摸事件时的属性集合,包含屏幕触摸点的信息数组。                 |
64| changedTouches | Array&lt;TouchInfo&gt; | 触摸事件时的属性集合,包括产生变化的屏幕触摸点的信息数组。数据格式和touches一样。该属性表示有变化的触摸点,如从无变有,位置变化,从有变无。例如用户手指刚接触屏幕时,touches数组中有数据,但changedTouches无数据。 |
65
66**表3** TouchInfo
67
68| 属性                 | 类型     | 说明                             |
69| ------------------ | ------ | ------------------------------ |
70| globalX            | number | 距离屏幕左上角(不包括状态栏)横向距离。屏幕的左上角为原点。 |
71| globalY            | number | 距离屏幕左上角(不包括状态栏)纵向距离。屏幕的左上角为原点。 |
72| localX             | number | 距离被触摸组件左上角横向距离。组件的左上角为原点。      |
73| localY             | number | 距离被触摸组件左上角纵向距离。组件的左上角为原点。      |
74| size               | number | 触摸接触面积。                        |
75| force<sup>6+</sup> | number | 接触力信息。                         |
76
77**表4** SwipeEvent 基础事件对象属性列表(继承BaseEvent)
78
79| 属性                    | 类型     | 说明                                       |
80| --------------------- | ------ | ---------------------------------------- |
81| direction             | string | 滑动方向,可能值有:<br/>- &nbsp;left:向左滑动;<br/>- &nbsp;right:向右滑动;<br/>- &nbsp;up:向上滑动;<br/>- &nbsp;down:向下滑动。 |
82| distance<sup>6+</sup> | number | 在滑动方向上的滑动距离。                             |
83
84**表5** PinchEvent 对象属性列表<sup>7+</sup>
85
86| 属性           | 类型     | 说明             |
87| ------------ | ------ | -------------- |
88| scale        | number | 缩放比例。           |
89| pinchCenterX | number | 捏合中心点X轴坐标,单位px。 |
90| pinchCenterY | number | 捏合中心点Y轴坐标,单位px。 |
91
92**表6** DragEvent对象属性列表(继承BaseEvent)<sup>7+</sup>
93
94| 属性                        | 类型                               | 说明               |
95| ------------------------- | -------------------------------- | ---------------- |
96| type                      | string                           | 事件名称。            |
97| globalX                   | number                           | 距离屏幕左上角坐标原点横向距离。 |
98| globalY                   | number                           | 距离屏幕左上角坐标原点纵向距离。 |
99| timestamp                 | number                           | 时间戳。             |
100| dataTransfer<sup>9+</sup> | [DataTransfer](#datatransfer对象9) | 用于传输数据。          |
101
102## Target对象<sup>6+</sup>
103
104当组件触发事件后,事件回调函数默认会收到一个事件对象,通过该事件对象可以获取相应的信息。
105
106
107
108| 属性                   | 类型     | 说明                                       |
109| -------------------- | ------ | ---------------------------------------- |
110| dataSet<sup>6+</sup> | Object | 组件上通过通用属性设置的[data-*](js-components-common-attributes.md)的自定义属性组成的集合。 |
111
112**示例:**
113
114```html
115<!-- xxx.hml -->
116<div>
117  <div data-a="dataA" data-b="dataB"
118    style="width: 100%; height: 50%; background-color: saddlebrown;"@touchstart='touchstartfunc'></div>
119</div>
120```
121
122```js
123// xxx.js
124export default {
125  touchstartfunc(msg) {
126    console.info(`on touch start, point is: ${msg.touches[0].globalX}`);
127    console.info(`on touch start, data is: ${msg.target.dataSet.a}`);
128  }
129}
130```
131
132## DataTransfer对象<sup>9+</sup>
133
134在拖拽操作的过程中,可以通过dataTransfer对象来传输数据,以便在拖拽操作结束的时候对数据进行其他操作。
135
136### setData<sup>9+</sup>
137
138setData(key: string, value: object): boolean
139
140设置给定key关联的数据。如果没有与该key关联的数据,则将其添加到末尾。如果该key关联的数据已经存在,则在相同位置替换现有数据。
141
142**参数:**
143
144| 参数名   | 参数类型   | 必填   | 描述      |
145| ----- | ------ | ---- | ------- |
146| key   | string | 是    | 数据键值。   |
147| value | object | 是    | 要存储的数据。 |
148
149**返回值:**
150
151| 类型      | 说明                       |
152| ------- | ------------------------ |
153| boolean | 执行结果,true表示成功,false表示失败。 |
154
155**示例:**
156
157```js
158// setData的value参数,可以是基本数据类型。
159dragStart(e) {
160	var isSetOK = e.dataTransfer.setData('name', 1);
161},
162// setData的value参数,也可以是对象类型。
163dragStart(e) {
164	var person = new Object();
165	person.name = "tom";
166	person.age = 21;
167	var isSetOK = e.dataTransfer.setData('person', person);
168}
169```
170### getData<sup>9+</sup>
171
172getData(key: string): object
173
174获取给定key关联的数据,如果没有与该key关联的数据,则返回空字符串。
175
176**参数:**
177
178| 参数名  | 参数类型   | 必填   | 描述    |
179| ---- | ------ | ---- | ----- |
180| key  | string | 是    | 数据键值。 |
181
182**返回值:**
183
184| 类型     | 说明     |
185| ------ | ------ |
186| object | 获取的数据。 |
187
188**示例:**
189
190```js
191dragStart(e) {
192	var person = new Object();
193	person.name = "tom";
194	person.age = 21;
195	e.dataTransfer.setData('person', person);
196},
197dragEnd(e){
198	var person = e.dataTransfer.getData('person');
199},
200```
201### clearData<sup>9+</sup>
202
203clearData(key?: string): boolean
204
205删除给定key关联的数据。如果没有与该key关联的数据,则该方法不会产生任何效果。
206如果key为空,则删除所有数据。
207
208**参数:**
209
210| 参数名  | 参数类型   | 必填   | 描述    |
211| ---- | ------ | ---- | ----- |
212| key  | string | 否    | 数据键值。 |
213
214**返回值:**
215
216| 类型      | 说明                       |
217| ------- | ------------------------ |
218| boolean | 执行结果,true表示成功,false表示失败。 |
219
220**示例:**
221
222```js
223dragEnd(e) {
224	var isSuccess = e.dataTransfer.clearData('name');
225}
226```
227### setDragImage<sup>9+</sup>
228
229setDragImage(pixelMap: PixelMap, offsetX: number,offsetY: number): boolean
230
231用于设置自定义的拖动图像。
232
233**参数:**
234
235| 参数名      | 参数类型     | 必填   | 描述                                       |
236| -------- | -------- | ---- | ---------------------------------------- |
237| pixelMap | [PixelMap](../../apis-image-kit/arkts-apis-image-PixelMap.md) | 是    | 前端传入的图片资源。 |
238| offsetX  | number   | 是    | 相对于图片的横向偏移量。                             |
239| offsetY  | number   | 是    | 相对于图片的纵向偏移量。                            |
240
241**返回值:**
242
243| 类型   | 说明                       |
244| ---- | ------------------------ |
245| boolean | 执行结果,true表示成功,false表示失败。 |
246
247**示例:**
248
249```js
250import image from '@ohos.multimedia.image';
251
252export default {
253    createPixelMap() {
254        let color = new ArrayBuffer(4 * 96 * 96);
255        var buffer = new Uint8Array(color);
256        for (var i = 0; i < buffer.length; i++) {
257            buffer[i] = (i + 1) % 255;
258        }
259        let opts = {
260            alphaType: 0,
261            editable: true,
262            pixelFormat: 4,
263            scaleMode: 1,
264            size: {
265                height: 96, width: 96
266            }
267        }
268        const promise = image.createPixelMap(color, opts);
269        promise.then((data) => {
270            console.error('-create pixelMap has info message:' + JSON.stringify(data));
271            this.pixelMap = data;
272            this.pixelMapReader = data;
273        })
274    },
275
276    onInit() {
277        this.createPixelMap()
278    },
279
280    dragStart(e) {
281        e.dataTransfer.setDragImage(this.pixelMapReader, 50, 50);
282    }
283}
284```