我在我的React应用程序中有一个div,我需要处理单击和触摸事件。但是当我在移动设备上轻敲时,它会触发两个事件。
如果我在移动设备上滑动或者在普通浏览器上单击,它都正常工作,每种情况下只触发一个事件。
如何解决这个问题,使得在轻敲时不会同时触发两个事件?
<div
className={myClasses}
onClick={this.myHandle}
onTouchStart={this.myHandle}
>
</div>
我在我的React应用程序中有一个div,我需要处理单击和触摸事件。但是当我在移动设备上轻敲时,它会触发两个事件。
如果我在移动设备上滑动或者在普通浏览器上单击,它都正常工作,每种情况下只触发一个事件。
如何解决这个问题,使得在轻敲时不会同时触发两个事件?
<div
className={myClasses}
onClick={this.myHandle}
onTouchStart={this.myHandle}
>
</div>
事件触发有一个明确定义的顺序(source):
touchstart
Zero or more touchmove events, depending on movement of the finger(s)
touchend
mousemove
mousedown
mouseup
click
event.preventDefault()
来防止点击事件触发。function App() {
const handleClick = () => {
alert('click');
};
const handleTouchEnd = (event) => {
alert('touchend');
event.preventDefault();
};
return (
<button
type="button"
onClick={handleClick}
onTouchEnd={handleTouchEnd}
>
Click Me
</button>
);
}
event.preventDefault()
在 mousedown
事件中来 prevent 一个 click
事件。如果你正在寻找解决方案(虽然不确定何时会出现这种情况),你需要使用 ref 来代替:function App() {
const prevent = React.useRef(false);
const handleClick = () => {
if (!prevent.current) {
alert('click');
} else {
prevent.current = false;
}
};
const handleMouseDown = () => {
prevent.current = true;
alert('mousedown');
};
return (
<button
type="button"
onClick={handleClick}
onMouseDown={handleMouseDown}
>
Click Me
</button>
);
}
event.stopPropagation()
来阻止它同时触发onTouchStart
和onMouseDown
。 - cueloop使用触摸事件和鼠标事件之间的类似情况解决了此问题。touchStart/mouseDown 或 touchEnd/mouseUp。根据每种情况,它会触发其中一种。
<div
className={myClasses}
onMouseUp={this.myHandle}
onTouchEnd={this.myHandle}
>
</div>
this.myHandle
е‡Ѕж•°еђ—пјџ - cevarisimport ReactDom from 'react-dom';
export default class YourClass extends Component {
componentDidMount(){
ReactDOM.findDOMNode(this).addEventListener('touchstart', (e)=>{
e.preventDefault();
console.log("touchstart triggered");
});
}
}
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>
onTouchStart
,然后是onClick
。我的处理程序this.myHandle
更改了状态,因此组件再次呈现。第二个事件(点击)仍然会被触发。 - MetaratonClick
不是一个“鼠标”事件,而是一个“点击”事件,在触摸设备上相当于“touchStart-followed-by-touchEnd”。因此,在触摸设备上,touchstart
触发,调用处理程序,touchend
触发,没有处理程序,然后click
触发,再次调用处理程序。只需删除onTouchStart
即可完成。 - Mike 'Pomax' Kamermans