### [HTML 的 oncontextmenu 事件怎么拦截并完美替换为自定义右键](https://www.huociguo.com/article/1450) **Published:** 2026-09-27T03:46:50 **Author:** 米了 **Excerpt:** 自定义右键只有一条正路: ,并在回调第一行同步调用 。这活儿的关键从来不是"能不能拦",而是"拦得及不及时"。… 自定义右键只有一条正路:`addEventListener('contextmenu', handler)`,并在回调第一行同步调用 `event.preventDefault()`。这活儿的关键从来不是”能不能拦”,而是”拦得及不及时”。 ![](https://api.huociguo.com/wp-content/uploads/2026/09/20260927114110670-2703bd9854-1.png "20260927114110670-2703bd9854-1") HTML oncontextmenu 拦截原生右键,实现自定义右键菜单,含完整实现逻辑与示例代码。 ## 内联属性为什么靠不住 很多人上来就写 `oncontextmenu="return false"`,看着一行搞定,实际三个硬伤: - 内联绑定,运行期间没法动态开关; - 不支持事件委托,列表里新增的节点绑不上; - 在 Vue / React 里直接失效——JSX 的 `onContextMenu={() => false}` 拦不住默认行为,菜单照弹。 **顺带避个坑:**别图省事监听 `document` 再用 `e.target.matches()` 过滤目标。子元素容易匹配漏,``、`