我希望我的网站在用户右键单击一个元素 <div class="myElement"></div>
时有自定义交互。因此,当元素被右键单击时,我不希望上下文菜单也弹出,以免破坏用户体验。是否有方法可以实现这一点(最好是使用CSS,但原始的JavaScript也可以)?
期望的结果:
.myElement {
contextMenuOnRightClick: none,
}
我希望我的网站在用户右键单击一个元素 <div class="myElement"></div>
时有自定义交互。因此,当元素被右键单击时,我不希望上下文菜单也弹出,以免破坏用户体验。是否有方法可以实现这一点(最好是使用CSS,但原始的JavaScript也可以)?
期望的结果:
.myElement {
contextMenuOnRightClick: none,
}
最简单的方法是使用一些非常简单的 JavaScript:
<div class="myElement" oncontextmenu="return false;"></div>
oncontextmenu
: 当上下文菜单(右键菜单)显示时触发的事件。return false;
: 取消事件,阻止菜单显示。更好的方法是,不要使用内联JS,而是创建可重用的类名.js-noMenu
并将其添加到任何应防止右键单击的元素中。
将JS行放入您的Javascript文件中。
[...document.querySelectorAll(".js-noMenu")].forEach( el =>
el.addEventListener('contextmenu', e => e.preventDefault())
);
<div class="js-noMenu">Right click me!</div>
<p>You <b>can</b> contextmenu me!</p>
<p class="js-noMenu">You cannot here</p>
基本上,Event.preventDefault()
可以防止浏览器触发默认行为。
/* disable right click */
document.addEventListener('contextmenu', event => event.preventDefault());
Event.preventDefault() 可以使用,但在某些浏览器(例如Chrome)上可能会产生错误/限制声音,而且由于您计划实现自定义操作,这可能不是最佳解决方案。
您将编写很多纯vanilla JS代码,以使其在所有浏览器上运行,因为仅实现跨浏览器选择器就需要大量代码,而没有像jQuery这样的库。
为此添加超过50k的jQuery库是荒谬的(除非您当然需要该库进行其他操作)。
您仍然可以使用与JS等效物相同的值来内联它,并使您的代码看起来仍然美观。
支持使用JS动态添加到页面的项目需要大量工作。
使用类似以下内容:
<div class="myElement" oncontextmenu="return!1"></div>
Event.stopPropagation()
- 这可能确实会导致事件冒泡问题。 - Roko C. Buljanreturn!1
呢?反正最后会被评估为“false”。我们应该编写易于理解的代码。同时,“return false”不建议使用,而是应该使用“preventDefault”(不停止事件传播)。 - Roko C. Buljan