如何在Chrome的自助服务终端模式下禁用右键单击/长按的上下文菜单

How to disable context menu on right click/long touch in a kiosk mode of Chrome?

本文关键字:单击 右键 上下文 菜单 模式 Chrome 终端 服务      更新时间:2023-09-26

我们正在为一家博物馆开发软件。在Windows 8.1上运行的几个带有触摸屏的交互式展台连接到本地网络。没有键盘,没有鼠标。带有Apache的服务器包含多个本地网站。每个自助服务终端都以自助服务终端模式运行一个 Google Chrome 副本。因此,我们有某种本地网络应用程序,可以为博物馆参观者提供信息。

现在,问题来了。如果访问者在屏幕上长时间触摸,它的工作方式类似于右键单击的类似物。此时将显示上下文菜单。我们根本不想要它。我在正文标签中添加了"oncontextmenu = return false",这很有帮助。但。我们有几个在iframe中运行的外部网站(博物馆与互联网相连)。上下文菜单确实出现在 iframe 上。AFAIK,没有办法使用 javascript 禁用它。

我们的系统工程师得到了一个完全禁用Windows右键单击的软件。任何地方,包括Chrome。但。它适用于鼠标。至于触摸...好吧,它可以禁用Chrome以外的任何地方的触摸事件。也许Chrome有自己的触摸事件处理程序,我不知道。

所以,毕竟。我们需要在Chrome的自助服务终端模式下右键单击/长按iframe上的上下文菜单。请给我一些建议。

我假设您在信息亭上显示一个普通的http://...(或可能是https://...file://...)网页。如果您实际显示的是应用程序(即chrome-extension://...),则此策略将不起作用。

window.addEventListener("contextmenu", function(e) { e.preventDefault(); })注入每个浏览上下文的Chrome扩展程序可能会阻止iframe上的上下文菜单。

manifest.json:

{
    "manifest_version": 2,
    "name": "Context Menu Blocker",
    "version": "1.0",
    "content_scripts": [
      {
        "matches": ["<all_urls>"],
        "js": ["contextblocker.js"],
        "all_frames": true,
        "match_about_blank": true
      }
    ]
}

上下文阻止程序.js:

window.addEventListener("contextmenu", function(e) { e.preventDefault(); })

只需创建一个文件夹并将两个文件放在其中即可。然后,转到 chrome://extensions/ ,选中Developer Mode框。最后,单击Load unpacked extension...并选择刚刚创建的文件夹。

这应该会阻止上下文菜单出现在允许运行扩展内容脚本的任何位置,包括 iframe 内加载的任何页面。它失败的几个值得注意的点:

  • 扩展程序不得在chrome://chrome-extension://网页或 Google 网上应用店中运行。如果您的展台正在显示应用,则整个策略将不起作用,因为此扩展程序将无法访问其他应用或扩展程序内的 iframe(即使 iframe 的源是它通常有权访问的源)。
  • 如果直接导航到 about:blank ,则内容脚本将不会运行,并且可能会出现上下文菜单。(但是,如果about:blank加载到 iframe 中,则块将正常工作。
  • 如果 iframe 具有不包含allow-scripts权限的 sandbox 属性,则扩展无法阻止来自该 iframe 的上下文菜单。

只要这些限制都不适用(并且只要页面上的脚本本身不会清除window上的所有事件侦听器),那么它应该可以工作。

我使用上面的代码在Chrome网上应用店中创建一个简单的扩展程序。(开发人员模式扩展现在会在启动时生成警告,而网上应用店扩展不会。

如果您使用的是jQuery,下面的代码将禁用上下文菜单(也称为"右键单击")。

$(document).on("contextmenu",function(){
       return false;
    }); 
});