在 React 中禁用 Firefox 的右键单击上下文菜单

Posted

技术标签:

【中文标题】在 React 中禁用 Firefox 的右键单击上下文菜单【英文标题】:Disable Firefox's right click context menu in React 【发布时间】:2019-12-17 08:49:10 【问题描述】:

我正在尝试禁用右键单击特定div 时弹出的上下文菜单。在渲染中我做

<div onContextMenu=(e) => 
    console.log(e); 
    e.preventDefault(); 
    e.stopPropagation(); 
    return false
>

它确实打印了,所以我知道它已连接,但它仍然会在 Firefox ESR 60.8.0 中弹出,即使它在 chrome 中被阻止。

原因:我有一个handsontable,我添加了一个自定义上下文菜单,并且在 Firefox 中,本机上下文菜单呈现在我的顶部。一旦我弄清楚如何在 Firefox 中的任何位置阻止上下文菜单,我会将其应用到自定义渲染器中的 handsontable

编辑:开始赏金是因为没有其他黑客对我有用,这是一个关于罕见版本的 firefox 的非常模糊的案例

【问题讨论】:

This 在当前的 Firefox 版本中为我工作;对你起作用吗?还是您的问题是针对去年的 Firefox 版本? @Nickolay 这在最新的 firefox 中对我有用,但我刚刚发现我有 ESR 版本的 firefox,它已经在 ESR 的最新版本 60.8.0 上。所以我想我正在寻找旧版本的解决方法。现在我知道我可以在逃跑时关闭它,但我不想让我们的用户这样做 【参考方案1】:

您需要在捕获阶段剪切菜单打开。

document.addEventListener("contextmenu", function(e) 
    if(e.target.id === "YOUR ELEMENT ID")  // identify your element here. You can use e.target.id, or e.target.className, e.target.classList etc...
        e.preventDefault();
        e.stopPropagation();
    
, true) // true means you are executing your function during capture phase

您可以在 componentDidMount 期间或在您的 React 代码之外设置此代码。

【讨论】:

非常接近!这禁用了我的自定义上下文菜单,而原生菜单仍然弹出。也许这比我想象的更适合动手操作......【参考方案2】:

我刚刚在 Firefox 中测试了这个,ESR 60.8 for Mac 并且它可以工作,你能否再次检查它是否也适合你。

请仔细检查您调用 preventDefault 的事件是否正确,我多次遇到 e 未定义的错误。

我还假设您正在使用标签中的 react 和帖子的语法

class Example extends React.Component 
  render() 
    return (
      <div className="red" onContextMenu=(e) => 
    console.log(e);
    e.preventDefault(); 
    e.stopPropagation(); 
>hello click me</div>
    );
  


ReactDOM.render(
    <Example/>,
    document.getElementById('root')
);
.red
  background: red;
  height: 150px;
  width: 150px;
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

<div id="root">
    <!-- This element's contents will be replaced with your component. -->
</div>

【讨论】:

是的,我正在使用 react。不幸的是,即使它在 chrome 中工作,这对我在 Firefox 中也不起作用。每次,事件的类型都是“contextmenu”,所以我认为这是正确的事件。防止默认和停止传播不会影响它 但是我刚刚发布的代码对您有用吗?这太奇怪了,因为它确实对我有用……可能是 Mac 还是微软? 没错,它不起作用:(我在 Windows 10 企业版上有 Firefox Quantum 60.8.0esr,不知道该怎么做,但感谢您的尝试 @MarcSlothEastman: 防止默认上下文菜单事件的能力应该由dom.event.contextmenu.enabled 控制,自 2000 年代以来就是true .. 也许尝试使用干净的 Firefox 配置文件?【参考方案3】:

最后的手段可能是将监听器绑定到元素的ref

this.handsontableRef.addEventListener('contextmenu', (e)=> 
  e.preventDefault();
  console.log("open your context menu");
);

在 Firefox 中试过这个,为我工作。分享确切的代码,以便我们也可以复制。

【讨论】:

Uncaught (in promise) TypeError: this.hotTableComponent.current.addEventListener is not a function jsfiddle.net/L892g65r 请正确阅读答案。我说要在 reference 上添加 listener 到您的元素,而不是在 React 组件上添加事件侦听器。无论如何,你在下面得到了答案。 这是你的意思吗? jsfiddle.net/uo4eL9n8/1 再次,它适用于 chrome 但对我来说不适用于 firefox(向 ref 添加事件侦听器直接给 this.hotTableComponent.addEventListener 不是函数) 您实际上对多个 DOM 元素使用了相同的引用,更新了代码,jsfiddle.net/eb3kwht4。请添加确切的 Firefox 版本,以便我也可以测试它。 啊,好吧,我知道为什么它不允许我将 ref 放在掌上电脑上,只有 div。我的版本是 Windows 10 企业版 Firefox Quantum 60.8.0esr【参考方案4】:

一位同事帮我解决了这个问题。这是我在工作计算机上预配置的 Firefox 设置的问题。要修复它,我必须在 firefox 中访问 about:config url,并通过双击更改 dom.event.contextmenu.enabled 值。这将其从“修改后的布尔值 false”更改为“默认布尔值 true”。 e.preventDefault() 的预期行为如下

【讨论】:

以上是关于在 React 中禁用 Firefox 的右键单击上下文菜单的主要内容,如果未能解决你的问题,请参考以下文章

使用 JavaScript 如何禁用右键单击或单击滚动条时如何在右键单击窗口中删除检查元素选项

如何禁用浏览器中的右键?

WPF 之 左键弹出操作菜单,并禁用右键菜单

利用jQuery禁止页面的右键单击

如何禁用html中的右键菜单? [复制]

在浏览器 DevTools 中不需要的右键单击