右键菜单_我想自定义网页右键上下文菜单

当我们在网页内使用鼠标右键点击页面,浏览器将显示默认的上下文菜单。这篇文章介绍如何将默认的上下文菜单替换为我们的自定义菜单,允许执行一些自定义操作。

我们先创建一个想要显示自定义上下文菜单的元素。

<div id="element">右键点击div>
<div id="menu">我是菜单div>

阻止显示默认的上下文菜单

想要做到这点,只需要在 contextmenu 事件内阻止默认行为即可。

const el = document.getElementById('element');

el.addEventListener('contextmenu', function (e) {
  e.preventDefault();
});

在点击的位置显示自定义菜单

自定义菜单位置需要通过计算得出,在计算之前,需将其定位到某个容器内。因此,我们需要包裹 element 和 menu。

<div id="relative">
  <div id="element">div>
  
  <div id="menu hidden">div>
div>
.relative {
  position: relative;
}

.absolute {
  position: absolute;
}

.hidden {
  display: none;
}

接下来就可以对自定义菜单的定位进行计算,我们需要获取到鼠标位置信息和 element 容器尺寸信息。

el.addEventListener('contextmenu', function (e) {
  const rect = el.getBoundingClientRect();

  const x = e.clientX - rect.left;
  const y = e.clientY - rect.top;

  // 设置菜单的位置
  menu.style.left = `${x}px`;
  menu.style.top = `${y}px`;

  // 显示菜单
  menu.classList.remove('hidden');
});

点击 menu 外部区域时隐藏 menu

el.addEventListener('contextmenu', function (e) {
  // ...
  document.addEventListener('click', handleClickDocument);
});

function handleClickDocument(e) {
  const isClickedOutside = !menu.contains(e.target);
  if (isClickedOutside) {
    // 隐藏菜单
    menu.classList.add('hidden');

    // 移除事件
    document.removeEventListener('click', handleClickDocument);
  }
}

给 menu 添加 hidden class,隐藏菜单。
隐藏菜单时,同时需要移除 document 上的 click 事件,也就是说 click 事件仅执行一次。

8732a544fac26d1894c2b4d70c857f94.gif

让事件只执行一次的还有另一种方式,在 addEventListener 方法传入第三个参数 { once: true }

document.addEventListener('click', handleClickDocument, { once: true });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值