编程语言
首页 > 编程语言> > javascript – 如何在Chrome的自助服务终端模式中禁用右键/长按功能上下文菜单?

javascript – 如何在Chrome的自助服务终端模式中禁用右键/长按功能上下文菜单?

作者:互联网

我们正在为博物馆制作软件. Windows 8.1上有几个带触摸屏的交互式信息亭,它们连接到本地网络.没有键盘,没有鼠标.带有Apache的服务器包含几个本地网站.每个自助服务终端都以自助服务终端模式运行Google Chrome副本.因此,我们有一些本地Web应用程序,为博物馆访问者提供信息.

现在,问题.如果访问者在屏幕上长时间触摸,则其工作方式类似于右键单击.出现上下文菜单.我们根本不需要它.我已经将“oncontextmenu = return false”添加到body标签中并且它有所帮助.但.我们在iframe中运行了几个外部网站(博物馆与互联网连接).上下文菜单确实出现在iframe上. AFAIK,没有办法使用javascript禁用它.

我们的系统工程师获得了一个完全禁用Windows右键单击的软件.包括Chrome在内的任但.它适用于鼠标.至于接触……好吧,除了Chrome之外,它还会禁用触摸事件.也许Chrome有自己的触摸事件处理程序,我不知道.

所以,毕竟.我们需要在Chrome的kiosk模式中右键单击/长按触摸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
      }
    ]
}

contextblocker.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权限的沙箱属性,则扩展程序无法阻止该iframe中的上下文菜单.

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

我已经使用上面的代码创建了a simple extension in the Chrome Web Store.(开发人员模式扩展现在会在启动时产生警告,而Web Store扩展则不会.)

标签:kiosk-mode,javascript,google-chrome,iframe
来源: https://codeday.me/bug/20191005/1857510.html