此文章是翻译SyntheticEvent这篇React(版本v16.2.0)官方文档。

SyntheticEvent

入门参考记录React 事件系统中的表单部分的SynthecticEvent 包装器。参考Handling Event 获取更多信息。

Overview

事件处理器将会传入一个SyntheticEvent 实例,一个跨浏览器的包装器包装着浏览器原生事件。它有着和浏览器原生事件相同的接口,包括stopPropagation()preventDefault() ,除了这些事件在所有浏览器中的工作相同。

如果你发现由于某些原因你需要底层浏览器事件,可以简单地使用nativeEvent 特性去处理它。每一个SyntheticEvent 对象有下面这些特性:

  1. boolean bubbles
  2. boolean cancelable
  3. DOMEventTarget currentTarget
  4. boolean defaultPrevented
  5. number eventPhase
  6. boolean isTrusted
  7. DOMEvent nativeEvent
  8. void preventDefault()
  9. boolean isDefaultPrevented()
  10. void stopPropagation()
  11. boolean isPropagationStopped()
  12. DOMEventTarget target
  13. number timeStamp
  14. string type

Note: 截至v0.14 这个版本,事件处理器中返回false 不再阻止事件传递。相反,视情况而定手动的触发e.stopPropagation() 或者e.preventDefault() 方法。

Event Pooling

SyntheticEvent 是一个池子(pooled)。这意味着SyntheticEvent 对象是可复用的并且所有的属性在事件函数被调用后都是无效的。这是考虑到性能问题。因此,你不能异步地访问这些事件。

  1. function onClick(event){
  2. console.log(event); // => nullified object
  3. console.log(event.type); // => "click"
  4. const eventType = event.type; // => "click"
  5. setTimeout(function(){
  6. console.log(event.type); // => null
  7. console.log(eventType); // => "click"
  8. },0);
  9. // Won't work, this.state.clickEvent will only contain null values
  10. this.setState({clickEvent: event});
  11. // You can still export event properties.
  12. this.setState({eventType: event.type});
  13. }

注意: 如果你想要异步地访问事件属性,你应该调用事件的event.persist(),这会从池子(pool)中移除合成事件(synthetic event)并且允许事件的引用通过用户代码保存。

Supported Events

React 标准化事件以至于它们有跨浏览器一致的属性。

下面的事件局部在冒泡阶段(in bubbling phase)被触发。在捕获阶段(the capture phase)注册一个事件句柄,追加Capture 到事件名称上:例如,替代使用onClick,你应该使用onClickCapture 在捕获阶段去处理事件。

参考

Clipboard Events

事件名称:

  1. onCopy onCute onPaste

属性:

  1. DOMDataTransfer clipboardData

Composition Events

事件名称:

  1. onCompositionEnd onCompositionStart onCompositionUpdate

属性:

  1. string data

Keyboard Events

事件名称:

  1. onKeyDown onKeyPress onKeyUp

属性:

  1. boolean altKey
  2. number charCode
  3. boolean ctrlKey
  4. boolean getModifierState(key)
  5. string key
  6. number keyCode
  7. string locale
  8. number location
  9. boolean metaKey
  10. boolean repeat
  11. boolean shiftKey
  12. number which

key 属性可以接受DOM级别3事件规范中记录的任何值。

Focus Events

事件名称:

  1. onFocus onBlur

这些focus event 工作在React DOM 上所有的元素,不仅是表单元素(form element)

属性:

  1. DOMEventTarget relatedTarget

Form Events

事件名称:

  1. onChange onInput onSubmit

了解更多关于onChange event,参考Forms

Mouse Events

事件名称:

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

onMouseEnteronMouseLeave 事件传播是从离开的元素 到进入的元素,而不是普通的冒泡,并且没有捕获阶段。

属性:

  1. boolean altKey
  2. number button
  3. number buttons
  4. number clientX
  5. number clientY
  6. boolean ctrlKey
  7. boolean getModifierState(key)
  8. boolean metaKey
  9. number pageX
  10. number pageY
  11. DOMEventTarget relatedTarget
  12. number screenX
  13. number screenY
  14. boolean shiftKey

Selection Events

事件名称:

  1. onSelect

Touch Events

事件名称:

  1. onTouchCancel onTouchEnd onTouchMove onTouchStart

属性:

  1. boolean altKey
  2. DOMTouchList changedTouches
  3. boolean ctrlKey
  4. boolean getModifierState(key)
  5. boolean metaKey
  6. boolean shiftKey
  7. DOMTouchList targetTouches
  8. DOMTouchList touches

UI Events

事件名称:

  1. onScroll

属性:

  1. number detail
  2. DOMAbstractView view

Wheel Events

事件名称:

  1. onWheel

属性:

  1. number deltaMode
  2. number deltaX
  3. number deltaY
  4. number deltaZ

Media Events

事件名称:

  1. onAbort onCanPlay onCanPlayThrough onDurationChange onEmptied onEncryted onEnded onError onLoadeData onLoadeMetadata onLoadStart onPause onPlay onPlaying onProgress onRateChange onSeeked onSeeking onStalled onSuspend onTimeUpdate onVolumeChange onWaiting

Image Events

事件名称:

  1. onLoad onError

Animation Events

事件名称:

  1. onAnimationStart onAnimationEnd onAnimationIteration

属性:

  1. string animationName
  2. string pseudoElement
  3. float elapsedTime

Transition Events

事件名称:

  1. onTransitionEnd

属性:

  1. string propertyName
  2. string pseudoElement
  3. float elapsedTime

Other Events

事件名称:

  1. onToggle