자바 스크립트 이벤트를 마우스 오른쪽 버튼으로 클릭합니까?


173

자바 스크립트 이벤트를 마우스 오른쪽 버튼으로 클릭합니까? 그렇다면 어떻게 사용합니까?

답변:


188

다른 사람들이 언급했듯이 오른쪽 마우스 버튼은 일반적인 마우스 이벤트 (mousedown, mouseup, click)를 통해 감지 할 수 있습니다 . 그러나 오른쪽 클릭 메뉴가 표시 될 때 발사 이벤트를 찾으려면 잘못된 위치를 찾고있는 것입니다. 오른쪽 클릭 / 컨텍스트 메뉴는 키보드 (Windows 및 일부 Linux의 경우 Shift + F10 또는 컨텍스트 메뉴 키)를 통해 액세스 할 수도 있습니다. 이 상황에서 찾고있는 이벤트는 oncontextmenu다음과 같습니다.

window.oncontextmenu = function ()
{
    showCustomMenu();
    return false;     // cancel default menu
}

마우스 이벤트 자체는 브라우저가 이벤트 처리 기능에서 액세스 할 수있는 이벤트 객체로 속성을 설정합니다.

document.body.onclick = function (e) {
    var isRightMB;
    e = e || window.event;

    if ("which" in e)  // Gecko (Firefox), WebKit (Safari/Chrome) & Opera
        isRightMB = e.which == 3; 
    else if ("button" in e)  // IE, Opera 
        isRightMB = e.button == 2; 

    alert("Right mouse button " + (isRightMB ? "" : " was not") + "clicked!");
} 

window.oncontextmenu-MDC


5
which / button 문제와 마찬가지로 'oncontextmenu'는 모든 브라우저에서 동일하게 구현되지는 않습니다. 일부 'gotchas'에 대해서는 quirksmode.org/dom/events/contextmenu.html 을 참조하십시오 .
smencer

3
@AndyE 안녕 앤디, 표현 (isRightMB?"was not" : "")은이어야한다 (isRightMB?"was" : "was not"). 권리 ? 그것을 검토하도록 도와주세요.
Joe.wang

1
@Joe : 재밌는 사람이없이 32 득표 4 년이 됐습니다. ;-) 변명 할 수있을 것 같아요-답변을 썼을 때 00:30 am!
Andy E

1
Mac FF에서는 ctrl + 오른쪽 클릭 이 마우스 왼쪽 클릭 (예 : === 1)으로, Mac에서는 ctrl + 오른쪽 클릭 이 마우스 오른쪽 클릭으로 예상됩니다 (e.ctrlKey && e .which === 3).
ND

8
크롬 59, 오른쪽 마우스 버튼 트리거에 onmousedownonmouseup있지만 onclick. 분명히 Chrome에서는 onclick왼쪽 마우스 버튼에 대해서만 트리거됩니다. 오른쪽 마우스 클릭을 검출 (와 남자 그래, 난이 여러 번 테스트), 당신은 결합 중 하나를 가지고 onmousedownonmouseup, 또는 사용 oncontextmenu.
Venryx

27

다음 jQuery 코드를 살펴보십시오.

$("#myId").mousedown(function(ev){
      if(ev.which == 3)
      {
            alert("Right mouse button clicked on element with id myId");
      }
});

의 가치 which는 다음과 같습니다.

  • 왼쪽 버튼의 경우 1
  • 중간 버튼의 경우 2
  • 오른쪽 버튼은 3

2
Eeeew, 끔찍하다! 왜 .which같지 .button않습니까? O .button=> 0,1,2 ; which=> 1,2,3 . 그건 틀렸어
벤 필립

11

다음과 같은 이벤트를 사용할 수 있습니다 window.oncontextmenu.

window.oncontextmenu = function () {
  alert('Right Click')
}
<h1>Please Right Click here!</h1>


이것은 또한 왼쪽 mb를 발사합니다
Alex

굉장한 +1, 이제 상황에 맞는 메뉴를 어떻게 차단합니까? @ user12345678
Shayan

2
@Shayan e.preventDefault ()
Brian Allan West

@BrianAllanWest jQuery입니까? 나는 그것을 사용하는 방법을 모른다. window.oncontextmenu = function () { e.preventDefault() }작동하지 않았다.
Shayan

2
@Shayan, 아니 그것은 원시 자바 스크립트입니다 ... 당신은 이것처럼 사용할 것입니다 ... window.oncontextmenu = function (e) {e.preventDefault ();} 컨텍스트 메뉴 (예 : 마우스 오른쪽 버튼을 클릭하거나 Mac을 길게 누릅니다).
Brian Allan West

6

w3c는 오른쪽 클릭이 클릭 이벤트에 의해 감지 될 수 있다고 말하지만 onClick은 일반적인 브라우저에서 오른쪽 클릭을 통해 트리거되지 않습니다.

실제로 마우스 오른쪽 버튼을 클릭하면 onMouseDown onMouseUp 및 onContextMenu 만 트리거됩니다.

따라서 "onContextMenu"를 오른쪽 클릭 이벤트로 간주 할 수 있습니다. HTML5.0 표준입니다.


1
예, 특히 최신 브라우저를 타겟팅하는 경우 훌륭한 솔루션 인 것 같습니다. IE 5.5조차도 요소에서 그것을 지원하기 때문에 이것이 HTML5.0이라고 생각하지 않습니다! 지원하는 브라우저는 다음과 같습니다. quirksmode.org/dom/events/contextmenu.html
Ignas2526

5

마우스 오른쪽 버튼 클릭을 감지하려면 MouseEvent.which속성이 표준이 아니므로 브라우저간에 비 호환성이 있으므로 속성을 사용하면 안됩니다 . ( MDN 참조 ) 대신 사용해야 MouseEvent.button합니다. 주어진 버튼을 나타내는 숫자를 반환합니다.

  • 0: 메인 버튼, 보통 왼쪽 버튼 또는 초기화되지 않은 상태
  • 1: 보조 버튼 누름, 일반적으로 휠 버튼 또는 중간 버튼 (있는 경우)
  • 2: 보조 버튼을 눌렀으며 일반적으로 오른쪽 버튼
  • 3: 네 번째 버튼, 일반적으로 브라우저 뒤로 버튼
  • 4: 다섯 번째 버튼, 일반적으로 브라우저 전달 버튼

MouseEvent.button 표준 마우스보다 더 많은 입력 유형을 처리합니다.

버튼은 표준 "왼쪽에서 오른쪽"레이아웃과 다르게 구성 될 수 있습니다. 왼손잡이 용으로 구성된 마우스는 버튼 동작이 반대로 될 수 있습니다. 일부 포인팅 장치에는 하나의 버튼 만 있고 키보드, 기타 입력 메커니즘을 사용하여 주, 보조, 보조 등을 나타냅니다. 다른 포인팅 장치에는 다른 기능과 버튼 값에 매핑 된 많은 버튼이있을 수 있습니다.

참고:

  1. https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/which
  2. https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button

이것이 내가 검색 할 때 처음 본 대답
이었으면 좋겠다

3

아니요, "onmousedown"이벤트에서 어떤 마우스 버튼이 사용되었는지 감지 할 수 있으며 "오른쪽 클릭"인지 확인할 수 있습니다.


@ 브라이언 : 오른쪽 클릭 트리거 onmousedown, onmouseup그리고 onclick. 그러나 마우스 오른쪽 버튼 클릭 메뉴를 재정의하려는 경우 이러한 이벤트는 사용하지 않아야합니다 (아래 답변 참조).
Andy E

2

다음 코드는 jQuery를 사용 rightclick하여 기본 mousedown및 이벤트를 기반으로 사용자 정의 이벤트 를 생성 mouseup합니다. 다음 사항을 고려합니다.

  • 마우스 업시 트리거
  • 전에 동일한 요소에서 마우스 다운을 눌렀을 때만 트리거
  • 이 코드는 특히 JFX Webview에서도 작동합니다 ( contextmenu 이벤트가 트리거되지 않기 때문에)
  • 키보드에서의 ContextMenu 키이 (가)와 솔루션처럼 (누를 때 트리거하지 않습니다 on('contextmenu', ...)않습니다

$(function ()
{ // global rightclick handler - trigger custom event "rightclick"
	var mouseDownElements = [];
	$(document).on('mousedown', '*', function(event)
	{
		if (event.which == 3)
		{
			mouseDownElements.push(this);
		}
	});
	$(document).on('mouseup', '*', function(event)
	{
		if (event.which == 3 && mouseDownElements.indexOf(this) >= 0)
		{
			$(this).trigger('rightclick');
		}
	});
	$(document).on('mouseup', function()
	{
		 mouseDownElements.length = 0;
	});
    // disable contextmenu
    $(document).on('contextmenu', function(event)
	{
		 event.preventDefault();
	});
});



// Usage:
$('#testButton').on('rightclick', function(event)
{
  alert('this was a rightclick');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="testButton">Rightclick me</button>


1

예-그렇습니다!

function doSomething(e) {
    var rightclick;
    if (!e) var e = window.event;
    if (e.which) rightclick = (e.which == 3);
    else if (e.button) rightclick = (e.button == 2);
    alert('Rightclick: ' + rightclick); // true or false
}

글쎄-기술적으로 "이벤트"는 아니지만 사용할 수 있습니다.
ChickenMilkBomb

@TimothyKhouri (및 다른 사람) : 이것은 호환되는 이벤트 리스너 기능입니다. addEventListener 의 두 번째 인수로 함수 객체 자체를 전달한 다음 지정된 이벤트가 발생할 때이를 호출 합니다. 예를 들면 다음과 같습니다.elem.addEventListener("click", doSomething)
John Weisz

1

예, oncontextmenu가 가장 좋은 대안 일 수 있지만 마우스를 누르면 트리거되고 클릭하면 마우스를 올리면 트리거됩니다.

다른 관련 질문은 수동 타이머 확인을 제외하고는 지원되지 않는 두 번 클릭에 대한 질문이었습니다. 왼손잡이 마우스 입력 (버튼 반전)을 지원해야하는 경우 오른쪽 더블 클릭을 원할 수있는 이유 중 하나입니다. 브라우저 구현은 사용 가능한 입력 장치를 어떻게 사용해야하는지에 대해 많은 가정을하는 것 같습니다.


1

마우스 오른쪽 버튼을 클릭하는 가장 쉬운 방법은

 $('classx').on('contextmenu', function (event) {

 });

그러나 이것은 크로스 브라우저 솔루션이 아니며이 이벤트, 특히 firefox 및 IE에서 브라우저가 다르게 작동합니다. 크로스 브라우저 솔루션을 권장합니다.

$('classx').on('mousedown', function (event) {
    var keycode = ( event.keyCode ? event.keyCode : event.which );
    if (keycode === 3) {
       //your right click code goes here      
    }
});

1

이것이 가장 쉬운 방법이며 CefSharp Chromium 등과 같은 응용 프로그램 웹보기를 제외한 모든 브라우저에서 작동합니다. 내 코드가 도움이 되길 바랍니다.

const contentToRightClick=document.querySelector("div#contentToRightClick");

//const contentToRightClick=window; //If you want to add it into the whole document

contentToRightClick.oncontextmenu=function(e){
  e=(e||window.event);
  e.preventDefault();
  console.log(e);
  
  return false; //Remove it if you want to keep the default contextmenu 
}
div#contentToRightClick{
  background-color: #eee;
  border: 1px solid rgba(0,0,0,.2);
  overflow: hidden;
  padding: 20px;
  height: 150px;
}
<div id="contentToRightClick">Right click on the box !</div>


1

window.oncontextmenu = function (e) {
  e.preventDefault()
  alert('Right Click')
}
<h1>Please Right Click here!</h1>


0

오른쪽 클릭 이벤트 동안 함수를 호출하려면 다음을 사용할 수 있습니다.

 <html lang="en" oncontextmenu="func(); return false;">
 </html>

<script>
function func(){
alert("Yes");
}
</script>

0

이것은 나와 함께 작동

if (evt.xa.which == 3) 
{
    alert("Right mouse clicked");
}

0

whichand / or button속성을 사용해보십시오

데모

function onClick(e) {
  if (e.which === 1 || e.button === 0) {
    console.log('Left mouse button at ' + e.clientX + 'x' + e.clientY);
  }
  if (e.which === 2 || e.button === 1) {
    console.log('Middle mouse button ' + e.clientX + 'x' + e.clientY);
  }
  if (e.which === 3 || e.button === 2) {
    console.log('Right mouse button ' + e.clientX + 'x' + e.clientY);
  }
  if (e.which === 4 || e.button === 3) {
    console.log('Backward mouse button ' + e.clientX + 'x' + e.clientY);
  }
  if (e.which === 5 || e.button === 4) {
    console.log('Forward mouse button ' + e.clientX + 'x' + e.clientY);
  }
}
window.addEventListener("mousedown", onClick);

여기에 몇 가지 정보


-1

jQuery라이브러리를 사용하여 이벤트 처리

$(window).on("contextmenu", function(e)
{
   alert("Right click");
})

-1

마우스 오른쪽 클릭을 처리하기 위해 'oncontextmenu'이벤트를 사용할 수 있습니다. 아래는 예입니다.

 document.body.oncontextmenu=function(event) {
     alert(" Right click! ");
 };

위의 코드는 마우스 오른쪽 버튼을 클릭하면 일부 텍스트를 경고합니다. 브라우저의 기본 메뉴를 표시하지 않으려면 return false를 추가 할 수 있습니다. 함수 내용의 끝에서. 감사.


단순히 일부 프레임 워크를 홍보하는 답변으로 응답하기보다는 바닐라 JS 솔루션이 포함 된 경우 답변이 더 유용 할 수 있습니다.
Xaniff

Ok ... 추천 해 주셔서 감사합니다. vanilA js를 사용하면 실제로 매우 쉽습니다
Sayanjyoti Das

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.