PC端撤回消息功能是用右擊事件即contextmenu出現popover,移動端使用長按事件出現popover來實現撤回消息功能,可是js並無提供長按事件,那該怎麼解決呢?web
相關環境:微信瀏覽器+React+騰訊TIMsdkredux
在onTouchStart事件裏添加一個定時器,時間設置爲700ms(多長時間本身定),定時器回調函數的邏輯是打開一個菜單,菜單有撤回選項;
在onTouchEnd事件裏的邏輯是移除定時器,由於若是長按事件未超過700ms,那麼此時不用顯示菜單,清除掉定時器是符合邏輯的,若是長按時間超過了700ms,此時,回調函數已經執行了,菜單已經顯示出來了,此時清楚掉定時器已經沒有關係了。瀏覽器
onTouchStart() { this.timerId = setTimeout(() => { // 打開菜單的邏輯 }, 700) } onTouchEnd() { clearTimeout(this.timerId) }
body { -webkit-user-select: none; user-select: none; -webkit-touch-callout: none; }
問題:給body添加此樣式後,致使其餘頁面,長按也不出現默認菜單,這個默認菜單,用戶也是須要用到的,裏面有複製功能微信
解決方案:只有進入消息頁時纔給body添加此樣式document.body.className
,離開消息頁面移除此樣式,進入其餘頁面不加此樣式函數
這一步沒有遇到什麼技術問題,計算一下便可this
這一步也沒有遇到什麼技術問題,計算一下便可code
若是是圖片消息,長按會出現默認的菜單,相似於保存圖片等,所以要給img添加樣式來禁掉接口
img{ pointer-events:none }
可是因爲pointer-events:none禁止了一切手指事件,所以須要在外層套一層div來觸發點擊查看大圖事件事件
例如:我撤回了一條消息,對方撤回了一條消息等,咱們參考了微信的交互。圖片
咱們調騰訊的TIMsdk的接口獲取完消息列表後,是存在redux裏面的,所以當有消息被撤回時,要主動修改該消息的isRevoked字段爲true,TIMsdk提供了MESSAGE_REVOKED事件用於監聽對方消息的撤回。