“b861b626720154d3592a83d400855b2aa408df69”上不存在“...reference/arkui-js/js-components-basic-input.md”
js-components-common-events.md 12.0 KB
Newer Older
Z
zengyawen 已提交
1
# 通用事件
Z
zengyawen 已提交
2

Z
zengyawen 已提交
3 4
> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> 从API version 4开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
Z
zengyawen 已提交
5

Z
zengyawen 已提交
6
## 事件说明
Z
zengyawen 已提交
7

Z
zengyawen 已提交
8
- 事件绑定在组件上,当组件达到事件触发条件时,会执行JS中对应的事件回调函数,实现页面UI视图和页面JS逻辑层的交互;
Z
zengyawen 已提交
9

Z
zengyawen 已提交
10
- 事件回调函数中通过参数可以携带额外的信息,如组件上的数据对象dataset,事件特有的回调参数。
Z
zengyawen 已提交
11 12


Z
zengyawen 已提交
13
相对于私有事件,大部分组件都可以绑定如下事件。
Z
zengyawen 已提交
14 15


H
HelloCrease 已提交
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| 名称                       | 参数         | 描述                                       | 是否支持冒泡         |
| ------------------------ | ---------- | ---------------------------------------- | -------------- |
| touchstart               | TouchEvent | 手指刚触摸屏幕时触发该事件。<br>> **说明:** TouchEvent具体可参考表2 TouchEvent对象属性列表 | 是<sup>5+</sup> |
| touchmove                | TouchEvent | 手指触摸屏幕后移动时触发该事件。                         | 是<sup>5+</sup> |
| touchcancel              | TouchEvent | 手指触摸屏幕中动作被打断时触发该事件。                      | 是<sup>5+</sup> |
| touchend                 | TouchEvent | 手指触摸结束离开屏幕时触发该事件。                        | 是<sup>5+</sup> |
| click                    | -          | 点击动作触发该事件。                               | 是<sup>6+</sup> |
| doubleclick<sup>7+</sup> | -          | 双击动作触发该事件                                | 否              |
| longpress                | -          | 长按动作触发该事件。                               | 否              |
| swipe<sup>5+</sup>       | SwipeEvent | 组件上快速滑动后触发该事件。<br/>> **说明:** SwipeEvent具体可参考表6 SwipeEvent 基础事件对象属性列表 | 否              |
| attached<sup>6+</sup>    | -          | 当前组件节点挂载在渲染树后触发。                         | 否              |
| detached<sup>6+</sup>    | -          | 当前组件节点从渲染树中移除后触发。                        | 否              |
| pinchstart<sup>7+</sup>  | PinchEvent | 手指开始执行捏合操作时触发该事件。<br/>> **说明:** PinchEvent具体可参考表7 PinchEvent 对象属性列表 | 否              |
| pinchupdate<sup>7+</sup> | PinchEvent | 手指执行捏合操作过程中触发该事件。                        | 否              |
| pinchend<sup>7+</sup>    | PinchEvent | 手指捏合操作结束离开屏幕时触发该事件。                      | 否              |
| pinchcancel<sup>7+</sup> | PinchEvent | 手指捏合操作被打断时触发该事件。                         | 否              |
| dragstart<sup>7+</sup>   | DragEvent  | 用户开始拖拽时触发该事件。<br/>> **说明:** DragEvent具体可参考表8 DragEvent对象属性列表 | 否              |
| drag<sup>7+</sup>        | DragEvent  | 拖拽过程中触发该事件。                              | 否              |
| dragend<sup>7+</sup>     | DragEvent  | 用户拖拽完成后触发。                               | 否              |
| dragenter<sup>7+</sup>   | DragEvent  | 进入释放目标时触发该事件。                            | 否              |
| dragover<sup>7+</sup>    | DragEvent  | 在释放目标内拖动时触发。                             | 否              |
| dragleave<sup>7+</sup>   | DragEvent  | 离开释放目标区域时触发。                             | 否              |
| drop<sup>7+</sup>        | DragEvent  | 在可释放目标区域内释放时触发。                          | 否              |
Z
zengyawen 已提交
39 40 41 42 43 44 45


> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> 除上述事件外,其他事件均为非冒泡事件,如[input的change事件](../arkui-js/js-components-basic-input.md#事件),详见各个组件。

**表1** BaseEvent对象属性列表

H
HelloCrease 已提交
46 47 48 49
| 属性        | 类型     | 说明                          |
| --------- | ------ | --------------------------- |
| type      | string | 当前事件的类型,比如click、longpress等。 |
| timestamp | number | 该事件触发时的时间戳。                 |
Z
zengyawen 已提交
50 51 52

**表2** TouchEvent对象属性列表(继承BaseEvent)

H
HelloCrease 已提交
53 54 55
| 属性             | 类型                     | 说明                                       |
| -------------- | ---------------------- | ---------------------------------------- |
| touches        | Array&lt;TouchInfo&gt; | 触摸事件时的属性集合,包含屏幕触摸点的信息数组。                 |
Z
zengyawen 已提交
56 57 58 59
| changedTouches | Array&lt;TouchInfo&gt; | 触摸事件时的属性集合,包括产生变化的屏幕触摸点的信息数组。数据格式和touches一样。该属性表示有变化的触摸点,如从无变有,位置变化,从有变无。例如用户手指刚接触屏幕时,touches数组中有数据,但changedTouches无数据。 |

**表3** TouchInfo

H
HelloCrease 已提交
60 61 62 63 64 65 66 67
| 属性                 | 类型     | 说明                             |
| ------------------ | ------ | ------------------------------ |
| globalX            | number | 距离屏幕左上角(不包括状态栏)横向距离。屏幕的左上角为原点。 |
| globalY            | number | 距离屏幕左上角(不包括状态栏)纵向距离。屏幕的左上角为原点。 |
| localX             | number | 距离被触摸组件左上角横向距离。组件的左上角为原点。      |
| localY             | number | 距离被触摸组件左上角纵向距离。组件的左上角为原点。      |
| size               | number | 触摸接触面积。                        |
| force<sup>6+</sup> | number | 接触力信息。                         |
Z
zengyawen 已提交
68 69 70

**表6** SwipeEvent 基础事件对象属性列表(继承BaseEvent)

H
HelloCrease 已提交
71 72 73 74
| 属性                    | 类型     | 说明                                       |
| --------------------- | ------ | ---------------------------------------- |
| direction             | string | 滑动方向,可能值有:<br/>1.&nbsp;left:向左滑动;<br/>2.&nbsp;right:向右滑动;<br/>3.&nbsp;up:向上滑动;<br/>4.&nbsp;down:向下滑动。 |
| distance<sup>6+</sup> | number | 在滑动方向上的滑动距离。                             |
Z
zengyawen 已提交
75 76 77

**表7** PinchEvent 对象属性列表<sup>7+</sup>

H
HelloCrease 已提交
78 79 80
| 属性           | 类型     | 说明             |
| ------------ | ------ | -------------- |
| scale        | number | 缩放比例           |
Z
zengyawen 已提交
81 82 83 84 85
| pinchCenterX | number | 捏合中心点X轴坐标,单位px |
| pinchCenterY | number | 捏合中心点Y轴坐标,单位px |

**表8** DragEvent对象属性列表(继承BaseEvent)<sup>7+</sup>

Y
yaoyuchi 已提交
86 87 88 89 90 91
| 属性         | 类型         | 说明                             |
| ------------ | ------------ | -------------------------------- |
| type         | string       | 事件名称。                       |
| globalX      | number       | 距离屏幕左上角坐标原点横向距离。 |
| globalY      | number       | 距离屏幕左上角坐标原点纵向距离。 |
| timestamp    | number       | 时间戳。                         |
Y
yaoyuchi 已提交
92
| dataTransfer | DataTransfer | DataTransfer对象<sup>9+</sup>。               |
Z
zengyawen 已提交
93

Y
yaoyuchi 已提交
94
## **target对象**
Z
zengyawen 已提交
95 96 97

当组件触发事件后,事件回调函数默认会收到一个事件对象,通过该事件对象可以获取相应的信息。

Y
yaoyuchi 已提交
98

Z
zengyawen 已提交
99

H
HelloCrease 已提交
100 101
| 属性                   | 类型     | 说明                                       |
| -------------------- | ------ | ---------------------------------------- |
Z
zengyawen 已提交
102
| dataSet<sup>6+</sup> | Object | 组件上通过通用属性设置的[data-*](../arkui-js/js-components-common-attributes.md)的自定义属性组成的集合。 |
Z
zengyawen 已提交
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122

**示例:**

```
<!-- xxx.hml -->
<div>
  <div data-a="dataA" data-b="dataB" 
    style="width: 100%; height: 50%; background-color: saddlebrown;"@touchstart='touchstartfunc'></div>
</div>
```

```
// xxx.js
export default {
  touchstartfunc(msg) {
    console.info(`on touch start, point is: ${msg.touches[0].globalX}`);
    console.info(`on touch start, data is: ${msg.target.dataSet.a}`);
  }
}
```
Y
yaoyuchi 已提交
123

Y
yaoyuchi 已提交
124
## DataTransfer对象<sup>9+</sup>
Y
yaoyuchi 已提交
125

Y
yaoyuchi 已提交
126
在拖曳操作的过程中,可以通过dataTransfer对象来传输数据,以便在拖曳操作结束的时候对数据进行其他操作。
Y
yaoyuchi 已提交
127

Y
yaoyuchi 已提交
128
### clearData
Y
yaoyuchi 已提交
129

Y
yaoyuchi 已提交
130
clearData(key?: string): boolean
Y
yaoyuchi 已提交
131

Y
yaoyuchi 已提交
132
删除与给定类型关联的数据。如果类型为空或未指定,则删除所有数据。如果指定类型的数据不存在,或者data transfer中不包含任何数据,则该方法不会产生任何效果。
Y
yaoyuchi 已提交
133

Y
yaoyuchi 已提交
134
**参数:**
Y
yaoyuchi 已提交
135 136 137

| 参数名 | 参数类型 | 必填 | 描述                                       |
| ------ | -------- | ---- | ------------------------------------------ |
Y
yaoyuchi 已提交
138
| key    | string   | 否   | 数据类型。key值存在时删除该类型关联的数据,key为空时删除所有数据。 |
Y
yaoyuchi 已提交
139

Y
yaoyuchi 已提交
140 141 142 143
**返回值:**
| 类型 | 说明 |
| ------ | -------- | 
| bool  | 执行结果  |
Y
yaoyuchi 已提交
144

Y
yaoyuchi 已提交
145
**示例:**
Y
yaoyuchi 已提交
146 147 148 149 150 151 152

  ```js
  dragEnd(e){
      var isSuccess = e.dataTransfer.clearData('name');
  }
  ```

Y
yaoyuchi 已提交
153
### getData
Y
yaoyuchi 已提交
154

Y
yaoyuchi 已提交
155
 getData(key: string): object
Y
yaoyuchi 已提交
156

Y
yaoyuchi 已提交
157
获取给定类型关联的数据,如果该类型的数据不存在或data transfer不包含数据,则返回空字符串。
Y
yaoyuchi 已提交
158

Y
yaoyuchi 已提交
159
**参数:**
Y
yaoyuchi 已提交
160 161 162

| 参数名 | 参数类型 | 必填 | 描述                       |
| ------ | -------- | ---- | -------------------------- |
Y
yaoyuchi 已提交
163
| key    | string   | 是   | 数据类型 |
Y
yaoyuchi 已提交
164

Y
yaoyuchi 已提交
165 166 167 168
**返回值:**
| 类型 | 说明 |
| ------ | -------- | 
| object | 获取的数据  |
Y
yaoyuchi 已提交
169

Y
yaoyuchi 已提交
170
**示例:**
Y
yaoyuchi 已提交
171 172 173 174 175 176 177 178 179 180 181 182 183

  ```js
  dragStart(e){
      var person = new Object();
      person.name = "list";
      person.age = 21;
      e.dataTransfer.setData('person', person);
  },
  dragEnd(e){
      var result = e.dataTransfer.getData('person');
  },
  ```

Y
yaoyuchi 已提交
184
### setData
Y
yaoyuchi 已提交
185

Y
yaoyuchi 已提交
186
setData(key: string, value: object): boolean
Y
yaoyuchi 已提交
187

Y
yaoyuchi 已提交
188
设置给定类型关联的数据。如果该类型的数据不存在,则将其添加到末尾。如果该类型的数据已经存在,则在相同位置替换现有数据。
Y
yaoyuchi 已提交
189

Y
yaoyuchi 已提交
190
**参数:**
Y
yaoyuchi 已提交
191 192 193

| 参数名 | 参数类型 | 必填 | 描述                    |
| ------ | -------- | ---- | ----------------------- |
Y
yaoyuchi 已提交
194 195
| key    | string   | 是   | 数据类型   |
| value  | object   | 是   | 要存储的数据 |
Y
yaoyuchi 已提交
196

Y
yaoyuchi 已提交
197 198 199 200
**返回值:**
| 类型 | 说明 |
| ------ | -------- | 
| bool  | 执行结果  |
Y
yaoyuchi 已提交
201

Y
yaoyuchi 已提交
202
**示例:**
Y
yaoyuchi 已提交
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219

  ```
  //setData 可以是基本数据类型,也可以是对象类型
  dragStart(e){
      var isSetOk = e.dataTransfer.setData('name', 1);
  }

  dragStart(e){
      var person = new Object();
      person.name = "list";
      person.age = 21;
       var isSetOk = e.dataTransfer.setData('person', person);
  }
  ```

### setDragImage

Y
yaoyuchi 已提交
220
setDragImage(pixelmap: Pixelmap, offsetX: number,offsetY: number): boolean
Y
yaoyuchi 已提交
221 222 223

用于设置自定义的拖动图像。

Y
yaoyuchi 已提交
224
**参数:**
Y
yaoyuchi 已提交
225 226 227 228 229 230 231

| pixelmap | 参数类型 | 必填 | 描述                                                         |
| -------- | -------- | ---- | ------------------------------------------------------------ |
| pixelmap | PixelMap | 是   | pixelmap为前端传入的图片资源,请参考[PixelMap对象](../apis/js-apis-image.md)。 |
| offsetX  | number   | 是   | 相对于图片的横向偏移量                                       |
| offsetY  | number   | 是   | 相对于图片的纵向偏移量                                       |

Y
yaoyuchi 已提交
232 233 234 235
**返回值:**
| 类型 | 说明 |
| ------ | -------- | 
| bool  | 执行结果  |
Y
yaoyuchi 已提交
236

Y
yaoyuchi 已提交
237
**示例:**
Y
yaoyuchi 已提交
238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263

  ```js
  CreatePixelMap(){
      let color=new ArrayBuffer(4*96*96);
      var buffer=new Uint8Array(color);
      for(var i=0;i<buffer.length;i++){
          buffer[i]=(i+1)%255;
      }
      let opts={
          alphaType:0,
          editable:true,
          pixelFormat:4,
          scaleMode:1,
          size:{height:96,width:96}
      }
      const promise=image.createPixelMap(color,opts);
      promise.then((data)=>{
          console.error('-----create pixmap has info message:'+JSON.stringify(data));
          this.pixelMap=data;
          this.pixelMapReader=data;
      })
  },
  dragStart(e){
      e.dataTransfer.setDragImage(this.pixelMapReader, 50, 50);
  },
  ```