在 Android 上长按禁用上下文菜单

IT技术 javascript android mobile-webkit
2021-01-27 18:45:30

我想禁用在我的 Web 应用程序中的图像上长按(触摸并按住)后出现的上下文菜单。我看过有不同想法的帖子,但似乎没有一个对我有用。

有没有办法通过 HTML/CSS/Javascript 在 Android 上做到这一点?

6个回答

上下文菜单有它自己的事件。你只需要抓住它并阻止它传播。

window.oncontextmenu = function(event) {
     event.preventDefault();
     event.stopPropagation();
     return false;
};
如何在 React 类组件中使用它?
2021-03-18 18:45:30
为 Cordova Windows 开发 Win10/UWP/MS Edge WebView :)
2021-03-21 18:45:30
我不会在函数中放置过滤器。将功能仅附加到您要禁用其上下文菜单的元素会更好更干净。
2021-03-28 18:45:30
作品!但现在我只想在锚元素上阻止上下文菜单。我有过滤器工作(当 [a] 时返回 false,否则返回 true)但返回 true 不显示对话框。所以..你如何告诉浏览器它应该显示?
2021-04-09 18:45:30

这应该适用于 1.6 或更高版本(如果我没记错的话)。我认为 1.5 或更早版本没有解决方法。

<!DOCTYPE html>
<html>
<head>
  <script>
    function absorbEvent_(event) {
      var e = event || window.event;
      e.preventDefault && e.preventDefault();
      e.stopPropagation && e.stopPropagation();
      e.cancelBubble = true;
      e.returnValue = false;
      return false;
    }

    function preventLongPressMenu(node) {
      node.ontouchstart = absorbEvent_;
      node.ontouchmove = absorbEvent_;
      node.ontouchend = absorbEvent_;
      node.ontouchcancel = absorbEvent_;
    }

    function init() {
      preventLongPressMenu(document.getElementById('theimage'));
    }
  </script>
</head>
<body onload="init()">
  <img id="theimage" src="http://www.google.com/logos/arthurboyd2010-hp.jpg" width="400">
</body>
</html>
你经常看到这种事情,但如果可以的话,你真的想避免干扰事件的传播。给定的事件对于“您的”组件以及页面上的其他组件可能很重要。例如,下拉菜单外的点击可能是滚动下拉列表的队列,以及直接对应于点击的任何动作。找到一种不会完全破坏页面上的事件处理的方法。
2021-03-13 18:45:30
自 8 月 8 日以来就没有看到任何 OP,所以我决定使用 SDK 自己测试一下。我测试了 1.5、1.6 和 2.2,并且在所有版本上都运行良好,所以我很高兴现在无需等待 OP 确认就可以授予赏金。+1也是一个很好的答案。
2021-03-17 18:45:30
这真的是正确答案吗?似乎img.addEventListener('contetxmenu', function(e) { e.preventDefault(); return false; }, false);应该工作没有?上面的解决方案将阻止所有输入。
2021-03-19 18:45:30
此解决方案禁用所有触摸事件。这可能是限制性的!
2021-04-01 18:45:30
@Andy:听起来是个好主意。我已经接受了 Roman 的回答,并将尝试进行更广泛的测试。如果它看起来像一个设备错误,那就这样吧。如果没有,我将发布另一个更具体的问题。再次感谢对 stackoverflow 新人的热烈欢迎!
2021-04-07 18:45:30

对我来说,吸收所有事件不是一种选择,因为我想禁用长按下载,同时仍允许用户缩放和平移图像。我只能通过在图像顶部分层“盾牌”div 来使用 css 和 html 解决这个问题,如下所示:

<div class="img-container">
  <div class="shield"></div>
  <img src="path.jpg">
</div>

img {
    max-width: 100%;
}

.shield {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    z-index: 1;
}

希望这对某人有帮助!

您可能需要向position:relative父容器添加一个,以防止父容器接管所有空间。如果父对象是td具有ontouchstart链接到它的 an或其他交互事件处理程序的 ,则这特别棘手,因为您不会在视觉上看到td正在占用所有区域。
2021-04-07 18:45:30

这可以使用 CSS来完成

img {
  pointer-events: none;
}
这不仅禁用了长按,还禁用了例如普通的敲击,所以并不总是一个选项。
2021-04-01 18:45:30

我使用了 Nurik 的完整示例,但元素(我页面中的输入图像)也被禁用了点击。

我通过以下方式更改原始行:

原线:

node.ontouchstart = absorbEvent_;

我的改变:

node.ontouchstart = node.onclick;

使用此方法,我禁用了 logpress 上的弹出保存图像菜单,但保留单击事件。

我正在 Dolphin HD 浏览器下使用 Android 2.2 的 7" 平板电脑进行测试,并且工作正常!