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-draggable组件实现Vue项目中表格内容的拖拽排序

    利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序

    这篇文章主要介绍了利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • 解决Vue动态加载本地图片问题

    解决Vue动态加载本地图片问题

    这篇文章主要介绍了Vue如何动态加载本地图片的相关知识,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • vue+elementUI用户修改密码的前端验证规则

    vue+elementUI用户修改密码的前端验证规则

    用户登录后修改密码,密码需要一定的验证规则,这篇文章主要介绍了vue+elementUI用户修改密码的前端验证,需要的朋友可以参考下
    2024-03-03
  • VUE django 跨域、csrf令牌的问题

    VUE django 跨域、csrf令牌的问题

    在Vue和Django进行前后分离开发时,经常会遇到跨域和CSRF令牌验证问题,本文详细介绍了如何在Django后端设置视图获取CSRF令牌,并在Vue前端进行配置以确保安全的数据交互,文章提供了后端视图创建、settings配置以及前端axios请求封装的具体方法
    2024-09-09
  • vue-resource请求实现http登录拦截或者路由拦截的方法

    vue-resource请求实现http登录拦截或者路由拦截的方法

    这篇文章主要介绍了vue-resource请求实现http登录拦截或者路由拦截的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Vue搭建后台系统需要注意的问题

    Vue搭建后台系统需要注意的问题

    这篇文章主要介绍了Vue搭建后台系统需要做的几点,文中给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • Vue.js中前端如何处理从后端返回的Excel文件流详解

    Vue.js中前端如何处理从后端返回的Excel文件流详解

    这篇文章主要介绍了如何在Vue项目中使用axios处理后端返回的Excel文件流,并提供下载功能,文中通过代码介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2025-01-01
  • vue作用域插槽详解、slot、v-slot、slot-scope

    vue作用域插槽详解、slot、v-slot、slot-scope

    这篇文章主要介绍了vue作用域插槽详解、slot、v-slot、slot-scope,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Vue3使用ECharts实现桑基图的代码示例

    Vue3使用ECharts实现桑基图的代码示例

    桑基图是一种用于直观显示流向数据的可视化工具,特别适合展示复杂的网络关系和资源流动,在前端项目中,通过结合 Vue 3 和 ECharts,可以快速实现交互性强、样式美观的桑基图,本文将通过完整的代码示例,带你一步步完成一个桑基图的实现,需要的朋友可以参考下
    2025-01-01
  • 详解vue3中如何使用shaka-player

    详解vue3中如何使用shaka-player

    这篇文章主要为大家介绍了vue3中如何使用shaka-player示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09

最新评论