mirror of
https://github.com/reactjs/react.dev.git
synced 2026-02-23 20:23:08 +00:00
* remove event pooling and SyntheticEvent#persist from documents Syntheticevent#event exists in v17, but it does nothing at the version * add a page for legacy event pooling for _redirects * add a warning e.persist() is no longer pooled * Update legacy-event-pooling.md * docs: update a redirect link for event pooling * Update legacy-event-pooling.md * Update legacy-event-pooling.md * Update reference-events.md Co-authored-by: Dan Abramov <dan.abramov@gmail.com>
377 lines
7.4 KiB
Markdown
377 lines
7.4 KiB
Markdown
---
|
|
id: events
|
|
title: SyntheticEvent
|
|
permalink: docs/events.html
|
|
layout: docs
|
|
category: Reference
|
|
---
|
|
|
|
This reference guide documents the `SyntheticEvent` wrapper that forms part of React's Event System. See the [Handling Events](/docs/handling-events.html) guide to learn more.
|
|
|
|
## Overview {#overview}
|
|
|
|
Your event handlers will be passed instances of `SyntheticEvent`, a cross-browser wrapper around the browser's native event. It has the same interface as the browser's native event, including `stopPropagation()` and `preventDefault()`, except the events work identically across all browsers.
|
|
|
|
If you find that you need the underlying browser event for some reason, simply use the `nativeEvent` attribute to get it. The synthetic events are different from, and do not map directly to, the browser's native events. For example in `onMouseLeave` `event.nativeEvent` will point to a `mouseout` event. The specific mapping is not part of the public API and may change at any time. Every `SyntheticEvent` object has the following attributes:
|
|
|
|
```javascript
|
|
boolean bubbles
|
|
boolean cancelable
|
|
DOMEventTarget currentTarget
|
|
boolean defaultPrevented
|
|
number eventPhase
|
|
boolean isTrusted
|
|
DOMEvent nativeEvent
|
|
void preventDefault()
|
|
boolean isDefaultPrevented()
|
|
void stopPropagation()
|
|
boolean isPropagationStopped()
|
|
void persist()
|
|
DOMEventTarget target
|
|
number timeStamp
|
|
string type
|
|
```
|
|
|
|
> Note:
|
|
>
|
|
> As of v17, `e.persist()` doesn't do anything because the `SyntheticEvent` is no longer [pooled](/docs/legacy-event-pooling.html).
|
|
|
|
> Note:
|
|
>
|
|
> As of v0.14, returning `false` from an event handler will no longer stop event propagation. Instead, `e.stopPropagation()` or `e.preventDefault()` should be triggered manually, as appropriate.
|
|
|
|
## Supported Events {#supported-events}
|
|
|
|
React normalizes events so that they have consistent properties across different browsers.
|
|
|
|
The event handlers below are triggered by an event in the bubbling phase. To register an event handler for the capture phase, append `Capture` to the event name; for example, instead of using `onClick`, you would use `onClickCapture` to handle the click event in the capture phase.
|
|
|
|
- [Clipboard Events](#clipboard-events)
|
|
- [Composition Events](#composition-events)
|
|
- [Keyboard Events](#keyboard-events)
|
|
- [Focus Events](#focus-events)
|
|
- [Form Events](#form-events)
|
|
- [Generic Events](#generic-events)
|
|
- [Mouse Events](#mouse-events)
|
|
- [Pointer Events](#pointer-events)
|
|
- [Selection Events](#selection-events)
|
|
- [Touch Events](#touch-events)
|
|
- [UI Events](#ui-events)
|
|
- [Wheel Events](#wheel-events)
|
|
- [Media Events](#media-events)
|
|
- [Image Events](#image-events)
|
|
- [Animation Events](#animation-events)
|
|
- [Transition Events](#transition-events)
|
|
- [Other Events](#other-events)
|
|
|
|
* * *
|
|
|
|
## Reference {#reference}
|
|
|
|
### Clipboard Events {#clipboard-events}
|
|
|
|
Event names:
|
|
|
|
```
|
|
onCopy onCut onPaste
|
|
```
|
|
|
|
Properties:
|
|
|
|
```javascript
|
|
DOMDataTransfer clipboardData
|
|
```
|
|
|
|
* * *
|
|
|
|
### Composition Events {#composition-events}
|
|
|
|
Event names:
|
|
|
|
```
|
|
onCompositionEnd onCompositionStart onCompositionUpdate
|
|
```
|
|
|
|
Properties:
|
|
|
|
```javascript
|
|
string data
|
|
|
|
```
|
|
|
|
* * *
|
|
|
|
### Keyboard Events {#keyboard-events}
|
|
|
|
Event names:
|
|
|
|
```
|
|
onKeyDown onKeyPress onKeyUp
|
|
```
|
|
|
|
Properties:
|
|
|
|
```javascript
|
|
boolean altKey
|
|
number charCode
|
|
boolean ctrlKey
|
|
boolean getModifierState(key)
|
|
string key
|
|
number keyCode
|
|
string locale
|
|
number location
|
|
boolean metaKey
|
|
boolean repeat
|
|
boolean shiftKey
|
|
number which
|
|
```
|
|
|
|
The `key` property can take any of the values documented in the [DOM Level 3 Events spec](https://www.w3.org/TR/uievents-key/#named-key-attribute-values).
|
|
|
|
* * *
|
|
|
|
### Focus Events {#focus-events}
|
|
|
|
Event names:
|
|
|
|
```
|
|
onFocus onBlur
|
|
```
|
|
|
|
These focus events work on all elements in the React DOM, not just form elements.
|
|
|
|
Properties:
|
|
|
|
```javascript
|
|
DOMEventTarget relatedTarget
|
|
```
|
|
|
|
* * *
|
|
|
|
### Form Events {#form-events}
|
|
|
|
Event names:
|
|
|
|
```
|
|
onChange onInput onInvalid onReset onSubmit
|
|
```
|
|
|
|
For more information about the onChange event, see [Forms](/docs/forms.html).
|
|
|
|
* * *
|
|
|
|
### Generic Events {#generic-events}
|
|
|
|
Event names:
|
|
|
|
```
|
|
onError onLoad
|
|
```
|
|
|
|
* * *
|
|
|
|
### Mouse Events {#mouse-events}
|
|
|
|
Event names:
|
|
|
|
```
|
|
onClick onContextMenu onDoubleClick onDrag onDragEnd onDragEnter onDragExit
|
|
onDragLeave onDragOver onDragStart onDrop onMouseDown onMouseEnter onMouseLeave
|
|
onMouseMove onMouseOut onMouseOver onMouseUp
|
|
```
|
|
|
|
The `onMouseEnter` and `onMouseLeave` events propagate from the element being left to the one being entered instead of ordinary bubbling and do not have a capture phase.
|
|
|
|
Properties:
|
|
|
|
```javascript
|
|
boolean altKey
|
|
number button
|
|
number buttons
|
|
number clientX
|
|
number clientY
|
|
boolean ctrlKey
|
|
boolean getModifierState(key)
|
|
boolean metaKey
|
|
number pageX
|
|
number pageY
|
|
DOMEventTarget relatedTarget
|
|
number screenX
|
|
number screenY
|
|
boolean shiftKey
|
|
```
|
|
|
|
* * *
|
|
|
|
### Pointer Events {#pointer-events}
|
|
|
|
Event names:
|
|
|
|
```
|
|
onPointerDown onPointerMove onPointerUp onPointerCancel onGotPointerCapture
|
|
onLostPointerCapture onPointerEnter onPointerLeave onPointerOver onPointerOut
|
|
```
|
|
|
|
The `onPointerEnter` and `onPointerLeave` events propagate from the element being left to the one being entered instead of ordinary bubbling and do not have a capture phase.
|
|
|
|
Properties:
|
|
|
|
As defined in the [W3 spec](https://www.w3.org/TR/pointerevents/), pointer events extend [Mouse Events](#mouse-events) with the following properties:
|
|
|
|
```javascript
|
|
number pointerId
|
|
number width
|
|
number height
|
|
number pressure
|
|
number tangentialPressure
|
|
number tiltX
|
|
number tiltY
|
|
number twist
|
|
string pointerType
|
|
boolean isPrimary
|
|
```
|
|
|
|
A note on cross-browser support:
|
|
|
|
Pointer events are not yet supported in every browser (at the time of writing this article, supported browsers include: Chrome, Firefox, Edge, and Internet Explorer). React deliberately does not polyfill support for other browsers because a standard-conform polyfill would significantly increase the bundle size of `react-dom`.
|
|
|
|
If your application requires pointer events, we recommend adding a third party pointer event polyfill.
|
|
|
|
* * *
|
|
|
|
### Selection Events {#selection-events}
|
|
|
|
Event names:
|
|
|
|
```
|
|
onSelect
|
|
```
|
|
|
|
* * *
|
|
|
|
### Touch Events {#touch-events}
|
|
|
|
Event names:
|
|
|
|
```
|
|
onTouchCancel onTouchEnd onTouchMove onTouchStart
|
|
```
|
|
|
|
Properties:
|
|
|
|
```javascript
|
|
boolean altKey
|
|
DOMTouchList changedTouches
|
|
boolean ctrlKey
|
|
boolean getModifierState(key)
|
|
boolean metaKey
|
|
boolean shiftKey
|
|
DOMTouchList targetTouches
|
|
DOMTouchList touches
|
|
```
|
|
|
|
* * *
|
|
|
|
### UI Events {#ui-events}
|
|
|
|
Event names:
|
|
|
|
```
|
|
onScroll
|
|
```
|
|
|
|
Properties:
|
|
|
|
```javascript
|
|
number detail
|
|
DOMAbstractView view
|
|
```
|
|
|
|
* * *
|
|
|
|
### Wheel Events {#wheel-events}
|
|
|
|
Event names:
|
|
|
|
```
|
|
onWheel
|
|
```
|
|
|
|
Properties:
|
|
|
|
```javascript
|
|
number deltaMode
|
|
number deltaX
|
|
number deltaY
|
|
number deltaZ
|
|
```
|
|
|
|
* * *
|
|
|
|
### Media Events {#media-events}
|
|
|
|
Event names:
|
|
|
|
```
|
|
onAbort onCanPlay onCanPlayThrough onDurationChange onEmptied onEncrypted
|
|
onEnded onError onLoadedData onLoadedMetadata onLoadStart onPause onPlay
|
|
onPlaying onProgress onRateChange onSeeked onSeeking onStalled onSuspend
|
|
onTimeUpdate onVolumeChange onWaiting
|
|
```
|
|
|
|
* * *
|
|
|
|
### Image Events {#image-events}
|
|
|
|
Event names:
|
|
|
|
```
|
|
onLoad onError
|
|
```
|
|
|
|
* * *
|
|
|
|
### Animation Events {#animation-events}
|
|
|
|
Event names:
|
|
|
|
```
|
|
onAnimationStart onAnimationEnd onAnimationIteration
|
|
```
|
|
|
|
Properties:
|
|
|
|
```javascript
|
|
string animationName
|
|
string pseudoElement
|
|
float elapsedTime
|
|
```
|
|
|
|
* * *
|
|
|
|
### Transition Events {#transition-events}
|
|
|
|
Event names:
|
|
|
|
```
|
|
onTransitionEnd
|
|
```
|
|
|
|
Properties:
|
|
|
|
```javascript
|
|
string propertyName
|
|
string pseudoElement
|
|
float elapsedTime
|
|
```
|
|
|
|
* * *
|
|
|
|
### Other Events {#other-events}
|
|
|
|
Event names:
|
|
|
|
```
|
|
onToggle
|
|
```
|