一 綁定事件處理函數
1.1 鼠標類
- onContextMenu
- onClick
- onDoubleClick
- onMouseDown
- onMouseUp
- onMouseEnter
- onMouseLeave
- onMouseMove
- onMouseOut
- onMouseOver
1.2 拖拽事件:
- onDrop
- onDrag
- onDragStart
- onDragEnd
- onDragEnter
- onDragLeave
- onDragOver
- onDragExit
1.3 觸摸
觸摸只會在移動設備上產生
- onTouchStart
- onTouchEnd
- onTouchMove
- onTouchCancel
1.4 鍵盤
onKeyPress是onKeyDown和onKeyUp的組合
- onKeyPress
- onKeyDown
- onKeyUp
1.5 剪切類
對應的是我們常常使用的復制、剪切和粘貼
- onCopy
- onCut
- onPaste
1.6 表單類
(會專門總結表單類事件,在此僅僅簡單列出)
- onChange
- onInput
- onSubmit
onChange可以用在輸入框、單選框、下拉列表里,每當內容發生變化時我們都能獲得通知。
onInput使用在文字輸入。
onSubmit是用在整個表單的輸入提交,常用在禁止表單的默認操作。
1.7 焦點事件
- onFocus
- onBlur
1.8 UI元素類
- onScroll
滾動事件觸發的時候會觸發onScroll事件
1.9 滾動
- onWheel
鼠標滾輪觸發的事件,監聽滾動幅度,滾動方位
1.10 組成事件
- onCompositionEnd
- onCompositionStart
- onCompositionUpdate
1.11 圖片類
- onLoad
- onError
1.12 多媒體類
- onAbort
- onCanPlay
- onCanPlayThrough
- onDurationChange
- onEmptied
- onEncrypted
- onEnded
- onError
- onLoadedData
- onLoadedMetadata
- onLoadStart
- onPause
- onPlay
- onPlaying
- onProgress
- onRateChange
- onSeeked
- onSeeking
- onStalled
- onSuspend
- onTimeUpdate
- onVolumeChange
- onWaiting
二 事件池
虛擬事件對象已經被合並。這意味着虛擬事件對象將被重新使用,而該事件回調被調用之后所有的屬性將無效。這是出於性能的考慮。因此,您不能以異步的方式訪問事件。
function onClick(event) {
console.log(event); // =>無效的對象
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}); // 不起作用.this.state.clickEvent 將只包含空值.
this.setState({eventType: event.type}); // 您依然可以導出事件屬性
}
如果您想以一個異步的方式來訪問事件屬性,您應該對事件調用
event.persist()。這將從事件池中取出合成的事件,並允許該事件的引用,使用戶的代碼被保留。
三 事件對象
事件處理器將會傳入SyntheticEvent的實例,一個對瀏覽器本地事件的跨瀏覽器封裝。它有和瀏覽器本地事件有相同的屬性和方法,包括stopPropagation()和preventDefault(),但是沒有瀏覽器兼容問題。
如果因為一些因素,需要底層的瀏覽器事件對象,只要使用nativeEvent屬性就可以獲取到它了。
對於 v0.14,在事件處理函數中返回
false將不會阻止事件冒泡。取而代之的是在合適的應用場景下,手動調用e.stopPropagation()或者e.preventDefault()。
handleChange:function(e){
console.log(e.target.value);
}
其中target是 事件對象e 是事件對象的屬性
3.1 通用屬性
(以下內容括號內為類型)
- bubbles (boolean) 表示事件是否冒泡
- cancelable(boolean) 表示事件是否可以取消
- currentTarget(DOMEventTarget) 與Target類似,由於事件可以冒泡,所以兩者表示的內容是不同的
- defaultPrevented(boolean) 表示事件是否禁止了默認行為
- eventPhase(number) 表示事件所處的階段
- isTrusted(boolean) 表示事件是否可信。所謂的可信事件表示的是用戶操作的事件,不可信事件就是通過JS代碼來觸發的事件。
- nativeEvent(DOMEvent)
- preventDefault() (void) 對應的defaultPrevented,表示的是禁止默認行為
- stopPropagaTion() (void) 對應的是bubbles,表示的是sh
- target(DOMEventTarget)
- timeStamp(number) 時間戳,也就是事件觸發的事件
- type(string) 事件的類型
3.2 不同事件對象的特有屬性
3.2.1 剪切事件
- clipboardData(DOMDataTransfer)表示拿到的數據
3.2.2 鍵盤事件
- ctrlKey(boolean) 表示是否按下ctrl鍵
- altKey(boolean) 表示是否按下alt鍵
- shiftKey(boolean) 表示是否按下shift
- metaKey(boolean) 表示的是win系統下的win鍵,mac系統下對應的command鍵
- getModifierState(key) (function) 表示是否按下輔助按鍵(輔助按鍵就是雷士ctrl、shift等輔助按鍵)可以傳入按鍵編碼來判斷是否按下
- charCode(Number) 表示的是按鍵的字符編碼,可以通過編碼來判斷按下的是什么鍵
- key(string) 字符串,按下的鍵
- keyCode(Number) 表示那些不是字符編碼的按鍵
- which(Number) 表示經過通用化得charCode和keyCode
- locale(String) 表示本地化得一些字符串
- location(number) 表示位置
- repeat(boolean) 表示按鍵是否重復
3.2.3 焦點事件
- relatedTarget(DOMEventTarget) 相關焦點對象
3.2.4 鼠標事件
- ctrlKey(boolean)
- altKey(boolean)
- shiftKey(boolean)
- metaKey(boolean)
- getModifierState(key) (function)
- button(Number)
- buttons(Number)
- clientX(Number) 原點為瀏覽器左上角
- clinetY(Number) 原點為瀏覽器左上角
- pageX(Number) 原點為HTML頁面的左上角
- pageY(Number) 原點為HTML頁面的左上角
- screenX(Number) 原點為顯示器的左上角
- screenY(Number) 原點為顯示器的左上角
- relatedTarget(DOMEventTarget)
3.2.5 觸摸事件
為了使觸摸事件生效,在渲染所有組件之前調用 React.initializeTouchEvents(true)。
- ctrlKey(boolean)
- altKey(boolean)
- shiftKey(boolean)
- metaKey(boolean)
- getModifierState(key)
- changedTouches(DOMTouchList) 判斷手勢操作
- targetTouches(DOMTouchList) 判斷手勢操作
- touches(DOMTouchList) 判斷手勢操作
3.2.6 UI元素事件
- detail(Number) 滾動的距離
- view(DOMAbstractView) 界面,視窗
3.2.7 鼠標滾動
- deltaMode(Number) 可以理解為移動的單位
- deltaX(Number) X軸移動的相對距離固定值
- deltaY(Number) Y軸移動的相對距離固定值
- deltaZ(Number) Z軸移動的相對距離固定值
3.3 實例
3.3.1 滾動事件對象
var HelloDada = React.creatClass({
getInitialState:function(){
return {
backgroundColor:'#FFFFFF'
}
},
handleWheel:function(e){
var newColor = (parseInt(this.state.backgroundColor.substr(1),16)+e.deltaY*997).tiString(16);
this.setState({
backgroundColor:newColor
})
},
render:function(){
return <div onWheel={this.handleWheel} style={this.state}>
<p>Dada Shuaige</p>
</div>
}
});
ReactDOM.render(<HelloDada />,document.body)
3.3.2 2.鍵盤事件對象
var Dada =React.creatClass{
getInitialState:function(){
return{
password:''
}
},
handleKeyPress:function(e){
this.setState({
paddword:this.state.password+e.which
});
},
handleChange:function(e){
e.target.value='';
},
render:function(){
return <div>
<input onKeyPress={this.handleKeyPress} onChange={this.handleChange} />
<p style={{
'display':this.state.password.indexOf('495051') >=0?'block':'none'
}}>Dada handsomeboy</p>
</div>
}
};
ReactDOM.render(<Dada />,document.body)
四 事件與狀態關聯
狀態不僅僅實現了組件內部結果的清晰對應,還實現了組件與用戶之間的交互,使用戶與組件的行為緊緊結合起來
handleChange:function(e){
this.setState({Dada:e.target.value});
}
this.setState設置狀態
4.1 實例
var Dada =React.creatClass({
getInitialState:function(){
return{
x:0,
y:0
}
},
handleMouseMove:function(e){
this.setState({
x:e.clientX,
y:e.clientY
});
},
render:function(){
return <div onMouseMove={this.handleMouseMove} style={{
width:'200px',
height:'200px',
backgroundColor:'#999'
}}>
{this.state.x+'.'+this.state.y}
</div>
}
});
ReactDOM.render(<Dada />,document.body)
