2015-01-29 3 views
10

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

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

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

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

+0

Хотя это потенциально может быть лазейкой безопасности, вы можете попробовать и отключить политику перекрестного домена Chrome и использовать 'window .frames ["frame_id"]. document.oncontextmenu = function() {return false}; ' – JCOC611

+0

@ JCOC611, отключив политику происхождения кросс-домена Chrome, вы подразумеваете запуск с помощью переключателя --disable-web-security? Если да, то это не работает, к сожалению ... – korsun

+0

Я думаю, что мой ответ не будет работать, если ваш просмотр кисока находится внутри приложения Chrome - вы не можете вставлять скрипт содержимого в iframe, загруженный внутри другого расширения или страницы приложения, даже если iframe предназначен для страницы, к которой обычно должен иметь расширение. ** Однако ** Я думаю, что можно решить вашу проблему, используя [''] (https://developer.chrome.com/apps/tags/webview) элементы вместо iframes: используйте 'executeScript' когда веб-просмотр запускает событие «contentload». – apsillers

ответ

13

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

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

Я воспользовался приведенным выше кодом для создания a simple extension in the Chrome Web Store. (Расширения для режима разработки теперь вызывают предупреждение при запуске, в то время как расширения в веб-магазине нет.)

+0

Сначала я принял ваш ответ скептически, но ... он работает! Это действительно работает! Большое спасибо! – korsun

+0

Chrome отобразит всплывающее окно, изменяющее пользователя на небезопасные расширения. – Twilite

+1

@Twilite Хм, они добавили, что поведение в недавнем обновлении, я думаю. Единственное, что я могу сделать, это загрузить расширение в Интернет-магазин Chrome и установить его там. Если вы не разработчик (и не хотите настраивать или тратить $ 5), я загружу его позже сегодня и добавлю ссылку. – apsillers