胡子哥哥
2019-04-26 14:15:49
我有一個(gè)svg矩形,其4個(gè)邊上有4個(gè)resizer,矩形和resizer都有onmousedown / onmousemove / onmouseup事件監(jiān)聽器。當(dāng)我從調(diào)整器調(diào)整矩形大小時(shí),當(dāng)我停止調(diào)整元素大小或者可能沒有觸發(fā)onmouseup時(shí),大小調(diào)整器的onmousemove不會(huì)停止。這是我的代碼:用于拖放的矩形事件: onMouseDown = (e) => {
if ( this.state.isDraggable ) {
document.addEventListener('mousemove', this.onMouseMove);
this.coords = {
x: e.clientX,
y: e.clientY
}
}
}
onMouseUp = (e) => {
// this.props.updateStateDragging(this.props.id, false);
document.removeEventListener('mousemove', this.onMouseMove);
this.coords = {};
}
onMouseMove = (e) => {
const xDiff = this.coords.x - e.clientX;
const yDiff = this.coords.y - e.clientY;
this.coords.x = e.clientX;
this.coords.y = e.clientY;
this.setState({
x: this.state.x - xDiff,
y: this.state.y - yDiff,
});
}用于調(diào)整矩形大小的縮放器事件: onMouseDown = (e) => {
document.addEventListener('mousemove', this.onMouseMove);
this.props.updateStateResizing(this.props.id, true);
this.props.updateStateDragging(this.props.id, false);
}
onMouseMove = (e) => {
if ( this.props.isResizing ){
this.props.nodeResizer(this.props.id, e.target, e.clientX, e.clientY);
}
}
onMouseUp = (e) => {
document.removeEventListener('mousemove', this.onMouseMove.bind(this));
if ( this.props.isResizing ){
this.props.updateStateResizing(this.props.id, false);
}
}我究竟做錯(cuò)了什么?怎么解決呢?
4 回答

MDSN
TA貢獻(xiàn)2條經(jīng)驗(yàn) 獲得超0個(gè)贊
onclick 事件會(huì)在一次完整的鼠標(biāo)左鍵按下并松開之后觸發(fā), 一般 onmouseup 是先于 onclick 事件觸發(fā)。
但是鼠標(biāo)左鍵按下不松開,并移動(dòng)鼠標(biāo)之后松開鼠標(biāo)左鍵,結(jié)果是 onmouseup 并不會(huì)觸發(fā)。
利用 onclick 是在 onmouseup 之后觸發(fā)的特點(diǎn),用 onclick 替代 onmouseup

MDSN
TA貢獻(xiàn)2條經(jīng)驗(yàn) 獲得超0個(gè)贊
onclick 事件會(huì)在一次完整的鼠標(biāo)左鍵按下并松開之后觸發(fā), 一般 onmouseup 是先于 onclick 事件觸發(fā)。
但是鼠標(biāo)左鍵按下不松開,并移動(dòng)鼠標(biāo)之后松開鼠標(biāo)左鍵,結(jié)果是 onmouseup 并不會(huì)觸發(fā)。
利用 onclick 是在 onmouseup 之后觸發(fā)的特點(diǎn),用 onclick 替代 onmouseup

青春有我
TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超8個(gè)贊
嘗試使用settimeout,無(wú)論您在何處使用document.removeEventListener,如:
setTimeout(() => { document.removeEventListener('mousemove', this.onMouseMove.bind(this));}, 500);

偶然的你
TA貢獻(xiàn)1841條經(jīng)驗(yàn) 獲得超3個(gè)贊
刪除“mousemove”偵聽器的調(diào)用必須提供添加偵聽器時(shí)提供的相同功能對(duì)象。然而
this.onMouseMove
與功能對(duì)象不同
this.onMouseMove.bind(this)
嘗試.bind(this)
在onMouseUp
代碼中刪除以開始。
技術(shù)說(shuō)明
重新綁定箭頭功能不會(huì)更改箭頭功能中this
看到的值。
箭頭函數(shù)始終使用在this
定義它們時(shí)生效的詞法值。從句法bind
上講,你可以調(diào)用一個(gè)箭頭函數(shù) - 它們是函數(shù)對(duì)象并從中繼承Function.prototype
- 但是箭頭函數(shù)從不使用this
提供的值bind
。
添加回答
舉報(bào)
0/150
提交
取消