我的React应用程序中有一个div,我需要处理点击和触摸。但是,当我点击手机时,它会触发两个事件。
如果我在手机上滑动或者点击普通浏览器,它可以正常工作,每种情况下只会触发一个事件。
如何处理此问题以解决这两个事件?
<div
className={myClasses}
onClick={this.myHandle}
onTouchStart={this.myHandle}
>
</div>
答案 0 :(得分:5)
使用触摸和鼠标之间的类似事件解决了这个问题。 touchStart / mouseDown或touchEnd / mouseUp。根据每种情况,它会发射一个或另一个。
<div
className={myClasses}
onMouseUp={this.myHandle}
onTouchEnd={this.myHandle}
>
</div>
答案 1 :(得分:2)
事件触发时应有明确的顺序:
touchstart
Zero or more touchmove events, depending on movement of the finger(s)
touchend
mousemove
mousedown
mouseup
click
防止事件
如果要防止发生click
事件,以防之前触发touchend
事件,可以在event.preventDefault()
事件处理程序中使用touchend
来防止{{ 1}}触发事件。
答案 2 :(得分:0)
这已经晚了几年,但是找到了一个真正易于实现的解决方案。看起来像这样:
import ReactDom from 'react-dom';
export default class YourClass extends Component {
componentDidMount(){
ReactDOM.findDOMNode(this).addEventListener('touchstart', (e)=>{
e.preventDefault();
console.log("touchstart triggered");
});
}
}
似乎它拦截并停止了我一直在寻找的移动设备上的所有onClick呼叫
答案 3 :(得分:0)
为避免在触摸设备上onClick()
,您应检查页面是否在触摸设备中打开。
要查看天气是否在触摸设备中打开:
if (typeof document !== 'undefined') {
var isTouch = 'ontouchstart' in document.documentElement;
}
然后将{isTouch ? undefined : this.myHandle}
修改为鼠标事件:
<div
className={myClasses}
onClick={isTouch ? undefined : this.myHandle}
onTouchStart={this.myHandle}
>
</div>