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

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

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

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

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


person korsun    schedule 29.01.2015    source источник
comment
Хотя это потенциально может быть лазейкой в ​​системе безопасности, вы можете попробовать отключить политику междоменного происхождения Chrome и использовать window.frames["frame_id"].document.oncontextmenu = function(){ return false };   -  person JCOC611    schedule 29.01.2015
comment
@ JCOC611, под отключением политики междоменного происхождения Chrome вы подразумеваете запуск с переключателем --disable-web-security? Если так, то это не работает, к сожалению...   -  person korsun    schedule 29.01.2015
comment
Я думаю, что мой ответ не сработает, если ваше представление kisok находится внутри приложения Chrome — вы не можете внедрить сценарий содержимого в iframe, загруженный на странице другого расширения или приложения, даже если iframe предназначен для страницы, которую обычно расширение должно иметь доступ к . Однако я думаю, что можно решить вашу проблему с помощью <webview> элементы вместо iframe: используйте метод executeScript, когда веб-представление запускает событие contentload.   -  person apsillers    schedule 29.01.2015


Ответы (2)


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

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

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 имеет атрибут sandbox, который не включает разрешение allow-scripts, тогда расширение не может блокировать контекстные меню из этого iframe.

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

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

person apsillers    schedule 29.01.2015
comment
Сначала я отнесся к вашему ответу скептически, но... это работает! Это реально работает! Большое спасибо! - person korsun; 29.01.2015
comment
Chrome отобразит всплывающее окно, изменяющее пользователя на используемые небезопасные расширения. - person Twilite; 28.05.2015
comment
@Twilite Хм, я думаю, они добавили это поведение в недавнем обновлении. Единственное предложение, которое я могу сделать, это загрузить расширение в Интернет-магазин Chrome и установить его оттуда. Если вы не разработчик (и не хотите настраивать или тратить 5 долларов), я загружу его позже сегодня и добавлю ссылку. - person apsillers; 28.05.2015
comment
Если бы ты это сделал, было бы здорово. Пожалуйста, разместите ссылку здесь. - person Twilite; 28.05.2015
comment
привет @apsillers, я попытался развернуть ваше расширение как часть исследования и разработки приложения Windows, которое использует [Ctrl + щелчок правой кнопкой мыши] в качестве глобальной привязки по умолчанию для запуска действия (для слова или изображения), и, похоже, оно больше не подавить контекстное меню в chrome 62. Очевидно, chrome начал разворачивать свое собственное контекстное меню где-то в прошлом году, и я подозреваю, что именно поэтому ваш ext больше не работает - есть мысли/идеи? - person propagated; 16.11.2017
comment
@propagated Я использую Chrome 62 (в Windows 7), и расширение по-прежнему отлично работает для меня. Я установил расширение из Интернет-магазина, загрузил example.com в новой вкладке, и оно правильно скрывает контекстное меню. Вы работаете с чем-то другим, кроме страницы http: или https:? Это не будет работать для chrome-extension: страниц, а чтобы оно работало на file: страницах, вы должны явно включить это в chrome://extensions. Он также не будет работать в Интернет-магазине Chrome, поскольку там отключены все расширения. - person apsillers; 16.11.2017
comment
У меня была аналогичная проблема. Мои сенсорные события вызывали контекстное меню. Похоже, что события касания вызывают события мыши после. Вы можете остановить это, вызвав preventDefault() в обработчике событий касания (touchDown и т. д.). Это решило проблему для меня; Мне не нужно было preventDefault() в обработчике контекстного меню. - person Enigma22134; 05.09.2019

Если вы используете jQuery, приведенный ниже код отключит контекстное меню (также известное как «щелчок правой кнопкой мыши»).

$(document).on("contextmenu",function(){
       return false;
    }); 
}); 
person daCoda    schedule 14.11.2019
comment
Вау, чисто и просто! - person SharpC; 14.09.2020