vue3实现鼠标右键显示菜单,点击其他地方消失问题

 更新时间:2024年04月26日 09:30:30   作者:一个无所事事的程序猿  
这篇文章主要介绍了vue3实现鼠标右键显示菜单,点击其他地方消失问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

vue3触发鼠标右键的回调函数

在标签上加上 @contextmenu=“contextmenu” 即可

<div @contextmenu="contextmenu" class="contextmenu"></div>

显示我们定义的菜单

去掉浏览器默认的菜单

  • 通过 preventDefault api
e.preventDefault();   //默认触发事件的行为被 preventDefault() 取消了
  • 定义一个菜单页面
  <div class="fixed-box" :style="fixedBoxStyleObject" v-show="isShowMenu" >
    <span>删除聊天</span>
  </div>

这个页面绑定isShowMenu变量用来显示或不显示菜单,通过fixedBoxStyleObject变量来设置菜单的位置

  • 定义触发的回调函数
const contextmenu = (e) => {
  e.preventDefault();   //默认触发事件的行为被 preventDefault() 取消了
  fixedBoxStyleObject.left = e.clientX + 'px'
  fixedBoxStyleObject.top = e.clientY + 'px'
  isShowMenu.value = true
}

点击其他地方菜单消失

一般我们用设置焦点和失去焦点触发事件来完成这个功能,例如:

在右键时设置焦点,那么当点击其他地方时就会触发失去焦点事件,在调用回调函数即可

  • 优化template部分
  <div tabindex="-1" class="fixed-box" :style="fixedBoxStyleObject" v-show="isShowMenu" @blur="isShowMenu = false" ref="fixedBoxRef">
    <span>删除聊天</span>
  </div>
  • 优化scipt部分
const contextmenu = (e) => {
  e.preventDefault();   //默认触发事件的行为被 preventDefault() 取消了
  fixedBoxStyleObject.left = e.clientX + 'px'
  fixedBoxStyleObject.top = e.clientY + 'px'
  isShowMenu.value = true
  setTimeout(() => {
      fixedBoxRef.value.focus()
  },1)
}

tips:

  • 由于div本身不能获取焦点,但设置tabindex后便可以获取焦点
  • 设定一个定时器的原因是dom从不显示到显示需要时间,必须得显示后才能获取焦点

css部分

.fixed-box{
  position: fixed;
  color: black;
  padding: 8px;
  width: fit-content;
  background-color: #F8F8F8;
}
.contextmenu{
	width:300px;
	height:300px;
  margin: 100px auto;
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vue.js实现在下拉列表区域外点击即可关闭下拉列表的功能(自定义下拉列表)

    Vue.js实现在下拉列表区域外点击即可关闭下拉列表的功能(自定义下拉列表)

    这篇文章主要介绍了Vue.js实现在下拉列表区域外点击即可关闭下拉列表的功能(自定义下拉列表) ,需要的朋友可以参考下
    2017-05-05
  • vue 微信分享回调iOS和安卓回调出现错误的解决

    vue 微信分享回调iOS和安卓回调出现错误的解决

    这篇文章主要介绍了vue 微信分享回调iOS和安卓回调出现错误的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • 在vue中使用防抖和节流,防止重复点击或重复上拉加载实例

    在vue中使用防抖和节流,防止重复点击或重复上拉加载实例

    今天小编就为大家分享一篇在vue中使用防抖和节流,防止重复点击或重复上拉加载实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Vue中引用JSON数据的方法小结

    Vue中引用JSON数据的方法小结

    在现代Web开发中,JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成,Vue.js作为一个流行的前端框架,支持多种方式引入和处理JSON数据,本文将详细介绍几种在Vue中引用JSON数据的方法,需要的朋友可以参考下
    2024-10-10
  • Vue引用echarts超详细步骤(附图文)

    Vue引用echarts超详细步骤(附图文)

    这篇文章主要给大家介绍了关于Vue引用echarts超详细步骤,vue中优雅的使用echarts​在前端工作中,数据可视化用得最多的,可能就是图表了,需要的朋友可以参考下
    2023-08-08
  • Vue生命周期中的组件化你知道吗

    Vue生命周期中的组件化你知道吗

    这篇文章主要为大家详细介绍了Vue生命周期中的组件化,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Vue登录拦截 登录后继续跳转指定页面的操作

    Vue登录拦截 登录后继续跳转指定页面的操作

    这篇文章主要介绍了Vue登录拦截 登录后继续跳转指定页面的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Vue 3中toRaw和markRaw的使用教程

    Vue 3中toRaw和markRaw的使用教程

    toRaw和markRaw是Vue 3中引入的新API,用于更精细地控制对象的代理和响应性,它们提供了在需要时绕过代理或禁用响应性的能力,有助于提高性能和更好地与第三方库进行集成,本文给大家介绍Vue 3中toRaw和markRaw的使用,感兴趣的朋友一起看看吧
    2023-10-10
  • IDEA安装vue插件图文详解

    IDEA安装vue插件图文详解

    这篇文章主要为大家详细介绍了IDEA安装vue插件图文,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • vue移动端设置全屏背景的项目实践

    vue移动端设置全屏背景的项目实践

    本vue移动端项目设置全屏背景,关键是要找对文件,然后添加background属性即可,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08

最新评论