在移动 IE 上禁用标注(上下文菜单)

Disable callout (context menu) on mobile IE

在网络应用程序中,我需要禁用移动浏览器在触摸并按住 ("long tap") 触摸目标(例如 <img> 或 [=30] 时显示的默认标注=].

我已经在为 iPhone 和 iPad 使用 -webkit-touch-callout: none。我为 IE 尝试了 -ms-touch-action:nonetouch-action:none,但这似乎不起作用(在 IE11 上测试,Windows Phone 8)。

来自 W3 邮件列表的

This post 建议为 Javascript 中的 "contextmenu" 事件添加一个侦听器并调用 e.preventDefault()。这似乎也不起作用。

有什么建议吗?

我尝试了所有 "normal" 或 "elegant" 选项,但显然 IE11 移动版忽略了其中的每一个选项。

唯一真正起作用的是旧丑 div-over-image:

<div class="img-container">
  <img src="path/to/image.jpeg" />
  <div class="cover"></div>
</div>

CSS:

.img-container {
  position: relative;
}
.cover {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
}

我做了很多研究,据我所知,这是你的两个选择:

  1. 使用透明<div>覆盖link/image
  2. 使用 <div>style="background: url(yourimage.png)" 而不是 <img src="yourimage.png">

核心问题是 Windows Phone 上的移动 IE 无法正确处理 preventDefaultcontextmenu 事件。这是执行此操作的正确方法,它适用于所有其他浏览器。 contextmenu 事件在 WP IE 上触发,但它实际上是在关闭长按上下文菜单时发生的。它甚至应该在显示菜单之前发生,以便您可以阻止它。

以下是我尝试过的一些其他选项:

  1. 事件:我尝试注册每个事件并使用 e.preventDefault()e.stopPropagation()return false 来阻止所有默认操作。 JSBin example.

  2. 使用 element:beforeelement:after 将元素放置在 link 或图像之上。我认为这可能能够自动执行透明 <div> 所做的事情。不幸的是,:before:after 内容是 <a> 的一部分,因此它们也都是可点击的。另外,显然 <img> 元素不支持 :before:afterJSBin example.

  3. user-select: none

  4. -ms-touch-action
  5. -webkit-touch-callout: none
  6. 我什至 ping 了 IE 团队的某个人,他不知道有什么办法。