vue3實(shí)現(xiàn)鼠標(biāo)右鍵顯示菜單,點(diǎn)擊其他地方消失問題
vue3觸發(fā)鼠標(biāo)右鍵的回調(diào)函數(shù)
在標(biāo)簽上加上 @contextmenu=“contextmenu” 即可
<div @contextmenu="contextmenu" class="contextmenu"></div>
顯示我們定義的菜單
去掉瀏覽器默認(rèn)的菜單
- 通過 preventDefault api
e.preventDefault(); //默認(rèn)觸發(fā)事件的行為被 preventDefault() 取消了
- 定義一個(gè)菜單頁面
<div class="fixed-box" :style="fixedBoxStyleObject" v-show="isShowMenu" > <span>刪除聊天</span> </div>
這個(gè)頁面綁定isShowMenu變量用來顯示或不顯示菜單,通過fixedBoxStyleObject變量來設(shè)置菜單的位置
- 定義觸發(fā)的回調(diào)函數(shù)
const contextmenu = (e) => { e.preventDefault(); //默認(rèn)觸發(fā)事件的行為被 preventDefault() 取消了 fixedBoxStyleObject.left = e.clientX + 'px' fixedBoxStyleObject.top = e.clientY + 'px' isShowMenu.value = true }
點(diǎn)擊其他地方菜單消失
一般我們用設(shè)置焦點(diǎn)和失去焦點(diǎn)觸發(fā)事件來完成這個(gè)功能,例如:
在右鍵時(shí)設(shè)置焦點(diǎn),那么當(dāng)點(diǎn)擊其他地方時(shí)就會(huì)觸發(fā)失去焦點(diǎn)事件,在調(diào)用回調(diào)函數(shù)即可
- 優(yōu)化template部分
<div tabindex="-1" class="fixed-box" :style="fixedBoxStyleObject" v-show="isShowMenu" @blur="isShowMenu = false" ref="fixedBoxRef"> <span>刪除聊天</span> </div>
- 優(yōu)化scipt部分
const contextmenu = (e) => { e.preventDefault(); //默認(rèn)觸發(fā)事件的行為被 preventDefault() 取消了 fixedBoxStyleObject.left = e.clientX + 'px' fixedBoxStyleObject.top = e.clientY + 'px' isShowMenu.value = true setTimeout(() => { fixedBoxRef.value.focus() },1) }
tips:
- 由于div本身不能獲取焦點(diǎn),但設(shè)置tabindex后便可以獲取焦點(diǎn)
- 設(shè)定一個(gè)定時(shí)器的原因是dom從不顯示到顯示需要時(shí)間,必須得顯示后才能獲取焦點(diǎn)
css部分
.fixed-box{ position: fixed; color: black; padding: 8px; width: fit-content; background-color: #F8F8F8; } .contextmenu{ width:300px; height:300px; margin: 100px auto; }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
利用Vue-draggable組件實(shí)現(xiàn)Vue項(xiàng)目中表格內(nèi)容的拖拽排序
這篇文章主要介紹了利用Vue-draggable組件實(shí)現(xiàn)Vue項(xiàng)目中表格內(nèi)容的拖拽排序,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-06-06vue+elementUI用戶修改密碼的前端驗(yàn)證規(guī)則
用戶登錄后修改密碼,密碼需要一定的驗(yàn)證規(guī)則,這篇文章主要介紹了vue+elementUI用戶修改密碼的前端驗(yàn)證,需要的朋友可以參考下2024-03-03vue-resource請(qǐng)求實(shí)現(xiàn)http登錄攔截或者路由攔截的方法
這篇文章主要介紹了vue-resource請(qǐng)求實(shí)現(xiàn)http登錄攔截或者路由攔截的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07vue作用域插槽詳解、slot、v-slot、slot-scope
這篇文章主要介紹了vue作用域插槽詳解、slot、v-slot、slot-scope,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Vue3使用ECharts實(shí)現(xiàn)?;鶊D的代碼示例
桑基圖是一種用于直觀顯示流向數(shù)據(jù)的可視化工具,特別適合展示復(fù)雜的網(wǎng)絡(luò)關(guān)系和資源流動(dòng),在前端項(xiàng)目中,通過結(jié)合?Vue?3?和?ECharts,可以快速實(shí)現(xiàn)交互性強(qiáng)、樣式美觀的?;鶊D,本文將通過完整的代碼示例,帶你一步步完成一個(gè)桑基圖的實(shí)現(xiàn),需要的朋友可以參考下2025-01-01