在单击位置显示自定义上下文菜单

当用户右键单击页面时,浏览器将显示默认上下文菜单。有时,我们希望用自己的菜单替换默认菜单,允许用户执行其他操作。

这篇文章演示了一个简单的实现。首先,让我们创建一个元素,以显示自定义的上下文菜单元素:

<div id="element">Right-click me</div>

<ul id="menu">...</menu>

防止显示默认上下文菜单

为了做到这一点,我们只需阻止 contextmenu 事件的默认操作:

const ele = document.getElementById('element')
ele.addEventListener('contextmenu', function (e) {
  e.preventDefault()
})

在单击的位置显示菜单

我们将计算菜单的位置,但首先需要绝对定位到其容器。因此,让我们将元素和菜单放置到位置 relative 的容器中:

<div class="relative">
  <div id="element">Right-click me</div>

  <ul id="menu" class="absolute hidden">...</menu>
</div>

relativeabsolutehidden 类定义如下:

.relative {
  position: relative;
}

.absolute {
  position: absolute;
}

.hidden {
  /* 菜单一开始是隐藏的 */
  display: none;
}

现在是设置菜单位置的时候了。可根据鼠标位置计算:

ele.addEventListener('contextmenu', function (e) {
  const rect = ele.getBoundingClientRect()
  const x = e.clientX - rect.left
  const y = e.clientY - rect.top

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

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

单击外部时关闭菜单

我们可以处理 的click事件document,并确定用户是否在菜单单击:

ele.addEventListener('contextmenu', function(e) {
  // ...
  document.addEventListener('click', documentClickHandler)
})

// 在菜单外部单击时隐藏菜单
const documentClickHandler = function(e) {
  const isClickedOutside = !menu.contains(e.target);
  if (isClickedOutside) {
    // 隐藏菜单
    menu.classList.add('hidden')

    // 移除事件处理程序
    document.removeEventListener('click', documentClickHandler)
  }
}

通过添加 hidden 类可以隐藏菜单。

更重要的是,click 事件处理程序也从 document 中删除,因为当菜单隐藏时,我们不需要处理它。

查看效果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 VS Code 中创建上下文菜单,您需要编写一个扩展。以下是一个简单的步骤: 1. 打开 VS Code 并创建一个新的文件夹,例如 `my-extension`。 2. 在终端中导航到该文件夹,并运行以下命令:`yo code`。这将启动 Yeoman 代码生成器,用于创建新的扩展。 3. 选择 `New Extension (TypeScript)`,然后按照提示进行操作。您需要提供一些基本信息,例如扩展的名称和描述。 4. 在生成的扩展项目中,找到 `package.json` 文件并打开它。在 `activationEvents` 中添加以下行: ``` "activationEvents": [ "onCommand:myExtension.myCommand", "onContextMenu" ] ``` 这将激活您的扩展,并在 VS Code 中显示上下文菜单。 5. 打开 `src/extension.ts` 文件,找到 `activate` 函数。在此函数中,使用以下代码创建上下文菜单: ``` vscode.commands.registerCommand('myExtension.myCommand', () => { const disposable = vscode.commands.registerCommand('myExtension.myCommand', () => { vscode.window.showInformationMessage('Hello World!'); }); vscode.window.showInformationMessage('My Extension is now active!'); const contextMenuDisposable = vscode.commands.registerCommand('myExtension.contextMenuCommand', () => { vscode.window.showInformationMessage('Context Menu Command!'); }); vscode.window.registerTreeDataProvider('myExtension.treeView', treeDataProvider); context.subscriptions.push(disposable); context.subscriptions.push(contextMenuDisposable); }); ``` 这将创建一个名为 `myExtension.contextMenuCommand` 的上下文菜单命令,并将其添加到扩展的订阅列表中。 6. 运行您的扩展。在 VS Code 中,使用快捷键 `F5` 或打开调试器并选择 `Run Extension`。一旦扩展启动,右键单击编辑器中的内容,您应该会看到您的上下文菜单。 这只是一个简单的示例,您可以根据需要自定义上下文菜单。有关更多信息,请参阅 VS Code 扩展开发文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值