PC端使用右键事件弹出右键菜单,移动端使用长按事件显示弹出消息实现撤消功能消息,但是js没有提供长按事件。那么如何解决呢?相关环境:微信浏览器+React+腾讯TIMsdk第一步:在移动端使用onTouchStart和onTouchEnd模拟长按事件在onTouchStart事件中添加一个定时器,时间设置为700ms(多长你自己定),然后timercallbackfunction逻辑是打开一个菜单,菜单有退出选项;onTouchEnd事件中的逻辑是清除定时器,因为如果长按事件不超过700ms,那么此时不需要显示菜单,清除定时器是合乎逻辑的。时间超过700ms。此时回调函数已经执行完毕,菜单已经显示出来。这个时候就很清楚了,禁用定时器也没关系。onTouchStart(){this.timerId=setTimeout(()=>{//打开菜单的逻辑},700)}onTouchEnd(){clearTimeout(this.timerId)}步骤2:为body添加样式以移除移动terminal长按会出现的默认菜单body{-webkit-user-select:none;用户选择:无;-webkit-touch-callout:none;}问题:给body加上这个样式后,会导致其他页面,长按也没有出现默认菜单。用户也需要这个默认菜单。里面有复制功能。此样式未添加到页面。第三步:添加逻辑判断,只能撤回两分钟内的消息。这一步没有技术问题。只是计算一下。如果您没有遇到任何技术问题,只需进行一些计算即可。第五步:给img图片添加样式,去掉了移动端默认长按会出现的选项。如果是图片消息,长按会出现一个默认菜单,类似保存图片等,所以需要给img添加一个样式,禁用img{pointer-events:none},但是因为pointer-events:none禁止所有手指事件,需要在外层设置一个div来触发点击查看大图事件。第六步:是对撤回的消息进行特殊处理。比如:我撤回消息,对方撤回消息等,我们指的是微信的交互。第七步:当消息被撤回时,主动修改isRevoked字段为true。我们调用腾讯的TIMsdk接口获取消息列表后,存放在redux中。因此,当消息被撤回时,主动修改消息。isRevoked字段为true,TIMsdk提供MESSAGE_REVOKED事件监听对方消息撤回。
