事件系统
合成事件
事件处理程序通过 合成事件
(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
onMouseEnter
和 onMouseLeave
事件从离开的元素传播到进入的元素,代替冒泡排序并且没有捕获阶段.
属性:
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
Media Events
事件名称:
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
事件名称:
onLoad onError