Edit on GitHub

事件系统

合成事件 #

事件处理程序通过 合成事件SyntheticEvent)的实例传递,SyntheticEvent 是浏览器原生事件跨浏览器的封装。SyntheticEvent 和浏览器原生事件一样有 stopPropagation()preventDefault() 接口,而且这些接口夸浏览器兼容。

如果出于某些原因想使用浏览器原生事件,可以使用 nativeEvent 属性获取。每个和成事件(SyntheticEvent)对象都有以下属性:

boolean bubbles
boolean cancelable
DOMEventTarget currentTarget
boolean defaultPrevented
number eventPhase
boolean isTrusted
DOMEvent nativeEvent
void preventDefault()
boolean isDefaultPrevented()
void stopPropagation()
boolean isPropagationStopped()
DOMEventTarget target
number timeStamp
string type

注意:

React v0.14 中,事件处理程序返回 false 不再停止事件传播,取而代之,应该根据需要手动触发 e.stopPropagation()e.preventDefault()

事件池 #

SyntheticEvent 是池化的. 这意味着 SyntheticEvent 对象将会被重用并且所有的属性都会在事件回调被调用后被 nullified. 这是因为性能的原因. 因此,你不能异步的访问事件.

function onClick(event) {
  console.log(event); // => nullified object.
  console.log(event.type); // => "click"
  var eventType = event.type; // => "click"

  setTimeout(function() {
    console.log(event.type); // => null
    console.log(eventType); // => "click"
  }, 0);

  this.setState({clickEvent: event}); // Won't work. this.state.clickEvent will only contain null values.
  this.setState({eventType: event.type}); // You can still export event properties.
}

注意:

如果你想异步访问事件属性,你应该在事件上调用 event.persist() ,这会从池中移除合成事件并允许对事件的引用被用会保留.

支持的事件 #

React 将事件统一化,使事件在不同浏览器上有一致的属性.

下面的事件处理程序在事件冒泡阶段被触发。如果要注册事件捕获处理程序,应该使用 Capture 事件,例如使用 onClickCapture 处理点击事件的捕获阶段,而不是 onClick

剪贴板事件 #

事件名称:

onCopy onCut onPaste

属性:

DOMDataTransfer clipboardData

Composition 事件 #

事件名称:

onCompositionEnd onCompositionStart onCompositionUpdate

属性:

string data

键盘事件 #

事件名称:

onKeyDown onKeyPress onKeyUp

属性:

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

焦点事件 #

事件名称

onFocus onBlur

属性:

DOMEventTarget relatedTarget

焦点事件在所有的React DOM上工作,不仅仅是表单元素.

表单事件 #

事件名称:

onChange onInput onSubmit

关于 onChange 事件的更多信息,参见 表单组件

鼠标事件 #

事件名称:

onClick onContextMenu onDoubleClick onDrag onDragEnd onDragEnter onDragExit
onDragLeave onDragOver onDragStart onDrop onMouseDown onMouseEnter onMouseLeave
onMouseMove onMouseOut onMouseOver onMouseUp

onMouseEnteronMouseLeave 事件从离开的元素传播到进入的元素,代替冒泡排序并且没有捕获阶段.

属性:

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

Selection Events #

事件名称:

onSelect

触控事件 #

事件名称:

onTouchCancel onTouchEnd onTouchMove onTouchStart

属性:

boolean altKey
DOMTouchList changedTouches
boolean ctrlKey
boolean getModifierState(key)
boolean metaKey
boolean shiftKey
DOMTouchList targetTouches
DOMTouchList touches

用户界面事件 #

事件名称:

onScroll

属性:

number detail
DOMAbstractView view

滚轮事件 #

事件名称:

onWheel

属性:

number deltaMode
number deltaX
number deltaY
number deltaZ

媒体事件 #

事件名称:

onAbort onCanPlay onCanPlayThrough onDurationChange onEmptied onEncrypted onEnded onError onLoadedData onLoadedMetadata onLoadStart onPause onPlay onPlaying onProgress onRateChange onSeeked onSeeking onStalled onSuspend onTimeUpdate onVolumeChange onWaiting

图片事件 #

事件名称:

onLoad onError

动画事件 #

事件名称:

onAnimationStart onAnimationEnd onAnimationIteration

属性:

string animationName
string pseudoElement
float elapsedTime

Transition Events #

事件名称:

onTransitionEnd

属性:

string propertyName
string pseudoElement
float elapsedTime