2015-01-29 3 views
10

우리는 박물관 용 소프트웨어를 개발 중입니다. 로컬 네트워크에 연결된 Windows 8.1에서 실행되는 터치 스크린이있는 대화 형 키오스크가 여러 개 있습니다. 키보드도없고 마우스도 없습니다. Apache가 설치된 서버에는 여러 개의 로컬 웹 사이트가 있습니다. 각 키오스크는 키오스크 모드로 Google 크롬 복사본을 실행합니다. 그래서 우리는 박물관 방문객에게 정보를 제공하는 지역 웹 어플리케이션을 가지고 있습니다.Chrome의 키오스크 모드에서 마우스 오른쪽 버튼을 클릭하거나 긴 터치에서 상황에 맞는 메뉴를 사용 중지하는 방법은 무엇인가요?

이제 문제가 발생했습니다. 방문자가 화면에서 길게 터치하면 마우스 오른쪽 버튼 클릭처럼 작동합니다. 컨텍스트 메뉴가 나타납니다. 우리는 전혀 원하지 않습니다. body 태그에 "oncontextmenu = return false"를 추가했는데 도움이되었습니다. 그러나. 우리는 iframe에서 실행되는 두 개의 외부 웹 사이트를 가지고 있습니다 (박물관은 인터넷에 연결되어 있습니다). 그리고 상황에 맞는 메뉴 으로 iframe에 표시됩니다. AFAIK, 자바 스크립트를 사용하여 비활성화하는 방법은 없습니다.

Google 시스템 엔지니어는 Windows에서 마우스 오른쪽 버튼을 완전히 사용할 수 없게하는 소프트웨어를 가지고 있습니다. Chrome을 포함한 어디에서나 사용할 수 있습니다. 그러나. 그것은 마우스에서 작동합니다. 그리고 접촉에 관해서는 ... 잘, 크롬 이외에 어디에서든지 접촉 사건을 무능하게한다. 어쩌면 크롬 자체 터치 이벤트 처리기를 가지고, 나도 몰라.

결국, 결국. Chrome의 키오스크 모드에서 마우스 오른쪽 버튼을 클릭하거나 긴 터치로 iframe의 상황에 맞는 메뉴를 제거해야합니다. 제게 조언 해주세요.

+0

* 잠재적으로 * 보안상의 허점이 될 수 있지만 Chrome의 교차 도메인 원점 정책을 시도하고 비활성화 할 수 있습니다. @DOCABLE-web-security 스위치를 사용하여 시작하는 Chrome의 교차 도메인 생성 정책을 사용 중지하면 @ – JCOC611

+0

@ JCOC611이 표시됩니다. 만약 그렇다면, 불행히도 작동하지 않습니다 ... – korsun

+0

당신의 kisok보기가 크롬 애플 리케이션 내부에 있다면 내 대답은 작동하지 않을 것 같아요 - iframe에 콘텐츠 스크립트를 삽입 할 수 없습니다. 다른 확장 프로그램의 내부에로드되었습니다. 또는 앱의 페이지 (확장 프로그램이 일반적으로 액세스해야하는 페이지의 iframe 인 경우에도 마찬가지입니다). ** 그러나 ** 나는 iframe 대신 [''] (https://developer.chrome.com/apps/tags/webview) 요소를 사용하여 문제를 해결할 수 있다고 생각합니다 :'executeScript' 메서드는 webview가'contentload' 이벤트를 발생시킬 때 호출됩니다. – apsillers

답변

13

나는 당신이 당신의 키오스크에 일반 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으로 직접 이동하면 콘텐츠 스크립트가 실행되지 않고 상황에 맞는 메뉴가 나타날 수 있습니다. 그러나 iframe에 about:blank이로드 된 경우 블록이 올바르게 작동합니다.
  • iframe에 allow-scripts 권한이 포함되지 않은 sandbox 특성이있는 경우 확장 프로그램은 해당 iframe의 컨텍스트 메뉴를 차단할 수 없습니다.

해당 제한 사항이 적용되지 않는 한 (페이지 자체의 스크립트가 window의 모든 이벤트 수신기를 지우지 않는 한) 작동해야합니다.

위의 코드를 사용하여 a simple extension in the Chrome Web Store을 만들었습니다. (개발자 모드 확장은 이제 시작시 경고 메시지를 표시하지만 웹 스토어 확장은 그렇지 않습니다.)

+0

처음에 나는 당신의 대답을 현명하게 받아 들였지만 ... 작동합니다! 실제로 작동한다! 고마워요! – korsun

+0

Chrome은 사용자가 안전하지 않은 확장 프로그램을 사용하도록 변경하는 팝업을 표시합니다. – Twilite

+1

@Twilite Hm, 그들은 최근 업데이트에서 이러한 동작을 추가했다고 생각합니다. Chrome 웹 스토어에 확장 프로그램을 업로드하고 거기에서 설치할 수있는 유일한 방법을 제안합니다. 개발자가 아니며 ($ 5를 설정하거나 사용하고 싶지 않다면) 나중에 오늘 업로드하고 링크를 추가 할 것입니다. – apsillers

관련 문제