網站首頁 Vue 正文
先給大家介紹下vue實現按鈕的長按功能,效果圖如下:
實現效果圖:
?
實現思路:
給需要操作的 dom 元素添加touchstart(點擊開始)、touchend(點擊結束)、touchmove(手指移動)事件
在使用touchstart(點擊開始)事件的時候設置定時器,在指定時間內如果不做其他操作就視為 長按事件,執行 長按事件 的同時需要設定當前不是 單擊事件,以防止touchend(點擊結束)執行的時候同時出現 長按事件 和 單擊事件
在 touchend(點擊結束)里面清除定時器,并判斷是不是 單擊事件
在 touchmove(手指移動)里面清除定時器,并設定當前不是 單擊事件
代碼
HTML
<div @touchstart="gotouchstart" @touchmove="gotouchmove" @touchend="gotouchend" class="div">按鈕</div>
JS
export default { data() { return {} }, methods: { // 手指按下事件 gotouchstart() { window.isClick = true clearTimeout(this.timeOut) this.timeOut = setTimeout(function() { console.log('在這里執行長按事件') window.isClick = false }, 500) }, //手釋放,如果在500毫秒內就釋放,則取消長按事件,此時可以執行onclick應該執行的事件 gotouchend() { if (window.isClick) { console.log('在這里執行點擊事件') } //如果手指有移動,則取消所有事件,此時說明用戶只是要移動而不是長按 gotouchmove() { console.log('手指移動了') window.isClick = false } // 項目銷毀前清除定時器 beforeDestroy() { clearTimeout(this.timeOut) } }
style(去除長按出現的文字復制影響)
-webkit-touch-callout:none; -webkit-user-select:none; -khtml-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none;
補充:下面看下Vue使用自定義指令實現按鈕長按提示功能,超簡單!
項目場景
點擊按鈕實現長按,用戶需要按下按鈕幾秒鐘,然后觸發相應的事件
實現思路
- 首先,需要創建一個計時器,在2 秒后開始執行函數,用戶按下按鈕時觸發
mousedown
事件,開始計時; - 當鼠標移開按鈕時開始調用
mouseout
事件 - 第一種情況,當
mouseup
事件 2 秒內被觸發了,需要清除計時器,相當于進行了普通的點擊事件 - 第二種情況,當計時器沒有在 2 秒內清除,那么這就可以判定為一次長按,可以執行長按的邏輯了。
- 如果在移動端使用,使用的就是
touchstart
,touchend
事件了 實現效果
實現代碼
<template> <div> <div class="btn-copy"><el-button v-press="handleClickLong">長按</el-button></div> </div> </template> <script> import press from '../../directive/test/press' export default { directives: { press }, data(){ return{ } }, methods:{ handleClickLong () { alert('實現了長按哦?。。?) }, } } </script> <style lang="scss"> </style>
press.js文件如下:
const press = { bind: function (el, binding, vNode) { console.log(el, binding, vNode) // el就是dom if (typeof binding.value !== 'function') { throw 'callback must be a function' } // 定義變量 let pressTimer = null // 創建計時器( 2秒后執行函數 ) let start = (e) => { if (e.type === 'click' && e.button !== 0) { return } if (pressTimer === null) { pressTimer = setTimeout(() => { handler() }, 2000) } } // 取消計時器 let cancel = (e) => { console.log(e) if (pressTimer !== null) { clearTimeout(pressTimer) pressTimer = null } } // 運行函數 const handler = (e) => { binding.value(e) } // 添加事件監聽器 el.addEventListener('mousedown', start) el.addEventListener('touchstart', start) // 取消計時器 el.addEventListener('click', cancel) el.addEventListener('mouseout', cancel) el.addEventListener('touchend', cancel) el.addEventListener('touchcancel', cancel) }, // 當傳進來的值更新的時候觸發 componentUpdated(el, { value }) { el.$value = value }, // 指令與元素解綁的時候,移除事件綁定 unbind(el) { el.removeEventListener('click', el.handler) }, } export default press
原文鏈接:https://blog.csdn.net/weixin_44684272/article/details/122691871
相關推薦
- 2023-07-14 element組件中的時間選擇器,禁用選擇時間,picker-options屬性詳解,時間選擇器范圍
- 2022-05-17 【go】解決“dial tcp 142.251.42.241:443: connect: conne
- 2022-06-19 C#?多線程中經常訪問同一資源可能造成哪些問題_C#教程
- 2022-11-04 關于docker部署服務時ip無法訪問服務正常的問題_docker
- 2022-05-26 為Jenkins創建定時構建任務_相關技巧
- 2022-06-07 FreeRTOS操作系統的配置示例解析_操作系統
- 2022-10-27 Kotlin?Flow操作符及基本使用詳解_Android
- 2022-03-31 QT實現單詞檢索軟件的示例代碼_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支