Как отключить контекстное меню при щелчке правой кнопкой мыши/длинном касании в режиме киоска Chrome?

Мы работаем над программным обеспечением для музея. В Windows 8.1 есть несколько интерактивных киосков с сенсорным экраном, которые подключены к локальной сети. Нет клавиатуры, нет мыши. Сервер с Apache на нем содержит несколько локальных сайтов. Каждый киоск запускает копию Google Chrome в режиме киоска. Итак, у нас есть некоторые локальные веб-приложения, которые предоставляют посетителю музея информацию.

Теперь проблема. Если посетитель долго прикасается к экрану, он работает как аналоговый щелчок правой кнопкой мыши. Появится контекстное меню. Мы этого не хотим. Я добавил "oncontextmenu = return false" в тег body, и это помогло. Но. У нас есть несколько внешних веб-сайтов, работающих в iframe (в музее есть подключение к Интернету). И контекстное меню делает на iframes. AFAIK, нет возможности отключить его с помощью javascript.

Наш системный инженер получил программное обеспечение, которое полностью отключает правый щелчок в Windows. В любом месте, включая Chrome. Но. Он работает для мыши. А что касается касаний... ну, он отключает события касания где-нибудь кроме Chrome. Возможно, у Chrome есть свой обработчик событий касания, я не знаю.

Итак, в конце концов. Нам нужно избавиться от контекстного меню на iframes при щелчке правой кнопкой мыши/длинном касании в режиме киоска Chrome. Пожалуйста, дайте мне несколько советов.

Ответ 1

Я предполагаю, что вы показываете обычную веб-страницу http://... (или, возможно, https://... или file://...)) в своем киоске. Если вы действительно показываете приложение (т.е. chrome-extension://...), эта стратегия не будет работать.

Расширение Chrome, которое вводит window.addEventListener("contextmenu", function(e) { e.preventDefault(); }) в каждый контекст просмотра, вероятно, сделает трюк для блокировки контекстных меню на iframes.

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 Web Store. Если ваш киоск отображает приложение, вся эта стратегия не будет работать, потому что это расширение не сможет получить доступ к iframes внутри другого приложения или расширения (даже если источник iframe является источником, который обычно имеет разрешение для доступа).
  • Если вы перейдете непосредственно к about:blank, содержимое script не будет запущено и появится контекстное меню. (Если about:blank загружается в iframe, однако, блок будет работать правильно.)
  • Если iframe имеет атрибут sandbox, который не включает разрешение allow-scripts, то расширение не может блокировать контекстные меню из этого iframe.

Пока ни одно из этих ограничений не применяется (и пока script на самой странице не очищает всех прослушивателей событий на window), тогда он должен работать.

Я использовал приведенный выше код для создания простого расширения в Интернет-магазине Chrome. (Расширения для режима разработчика теперь вызывают предупреждение при запуске, в то время как расширения в веб-магазине - нет.)