【发布时间】:2011-03-25 17:29:51
【问题描述】:
我想禁用在我的网络应用程序中长按(触摸并按住)图像后出现的上下文菜单。我已经看到了不同想法的帖子,但它们似乎都不适合我。
有没有办法通过 HTML/CSS/Javascript 在 Android 上执行此操作?
【问题讨论】:
标签: javascript android mobile-webkit
我想禁用在我的网络应用程序中长按(触摸并按住)图像后出现的上下文菜单。我已经看到了不同想法的帖子,但它们似乎都不适合我。
有没有办法通过 HTML/CSS/Javascript 在 Android 上执行此操作?
【问题讨论】:
标签: javascript android mobile-webkit
上下文菜单有自己的事件。你只需要抓住它并阻止它传播。
window.oncontextmenu = function(event) {
event.preventDefault();
event.stopPropagation();
return false;
};
【讨论】:
这应该适用于 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>
【讨论】:
img.addEventListener('contetxmenu', function(e) { e.preventDefault(); return false; }, false); 应该工作不?上述解决方案将阻止所有输入。
对我来说,吸收所有事件不是一个选项,因为我想禁用长按下载,同时仍然允许用户缩放和平移图像。我只能通过在图像顶部分层“屏蔽”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 或其他与之链接的交互事件处理程序,这将特别棘手,因为您不会在视觉上看到 td 占用了所有区域。
可以做到using CSS:
img {
pointer-events: none;
}
【讨论】:
我使用了 Nurik 的完整示例,但该元素(我页面中的输入图像)也被禁用了点击。
我把原来的行改成这样:
原行:
node.ontouchstart = absorbEvent_;
我的改变:
node.ontouchstart = node.onclick;
使用此方法,我禁用了 logpress 上的弹出保存图像菜单,但保留了点击事件。
我正在使用 Dolphin HD 浏览器和 Android 2.2 的 7 英寸平板电脑上进行测试,并且运行良好!
【讨论】:
它将禁用复制,但不会禁用选择。
document.oncontextmenu = function() {return false;};
在 webView 中工作。
【讨论】:
将此 CSS 代码用于移动设备
-webkit-touch-callout: none;
-webkit-user-select: none; /* Disable selection/copy in UIWebView */
【讨论】:
pointer-events: none; // for Android
-webkit-touch-callout: none; // for iOS
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
【讨论】:
pointer-events: none; 本质上是 CSS 元素的 return false,所以它使我的按钮在这种情况下不起作用。
我也遇到过类似的问题。我已经从这个线程和另一个 safari 线程尝试了几个解决方案来解决同样的问题 (Preventing default context menu on longpress / longclick in mobile Safari (iPad / iPhone)) 。不好的是我不能使用 onTouchStart、onTouchEnd 等...
仅阻止来自 onContextMenu 的事件。来自 React 16.5.2 的片段。 仅在 chrome 中测试。
<img {...props} onContextMenu={event => event.preventDefault()}
onTouchStart={touchStart}
onTouchEnd={touchEnd} />
希望它可以帮助某人。干杯!
【讨论】:
<a id="moo" href=''> </a>
<script type="text/javascript">
var moo = document.getElementById('moo');
function handler(event) {
event = event || context_menu.event;
if (event.stopPropagation)
event.stopPropagation();
event.cancelBubble = true;
return false;
}
moo.innerHTML = 'right-click here';
moo.onclick = handler;
moo.onmousedown = handler;
moo.onmouseup = handler;
</script>
捕获 onContextMenu 事件,并在事件处理程序中返回 false。
在某些浏览器中,您还可以捕获单击事件并使用 event.button 检查哪个鼠标按钮触发了该事件。
【讨论】:
刚刚遇到类似的问题。上述建议在 Andoid 浏览器中对我不起作用,但我发现将有问题的图像显示为 CSS 背景图像而不是嵌入图像可以解决问题。
【讨论】:
通过原始 javascript,上下文菜单不会调用任何事件。也许在 Java 世界中有些东西......实际上在 Android webkit 中存在一些关于 javascript 事件的问题(例如焦点无法正常工作)。
【讨论】: