Clique com o botão direito do mouse em um evento Javascript?

173

Clique com o botão direito do mouse em um evento Javascript? Se sim, como eu o uso?

Brian
fonte

Respostas:

188

Como outros já mencionaram, o botão direito do mouse pode ser detectado através dos eventos usuais do mouse (redução do mouse, mouseup, clique) . No entanto, se você estiver procurando por um evento de disparo quando o menu do botão direito for exibido, estará no lugar errado. O botão direito do mouse / menu de contexto também é acessível através do teclado (shift + F10 ou tecla de menu de contexto no Windows e em alguns Linux). Nessa situação, o evento que você está procurando é oncontextmenu:

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

Quanto aos próprios eventos do mouse, os navegadores configuram uma propriedade para o objeto de evento que é acessível a partir da função de manipulação de eventos:

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

Andy E
fonte
5
Assim como no problema do botão /, o 'oncontextmenu' não é implementado da mesma forma em todos os navegadores ... veja quirksmode.org/dom/events/contextmenu.html para algumas das dicas.
smencer
3
@ Andy Andy Oi, a expressão (isRightMB?"was not" : "")deve ser (isRightMB?"was" : "was not"). Certo ? Por favor, ajude a analisá-lo.
31514 Joe.wang
1
@ Joe: engraçado como foram 32 votos a favor e 4 anos sem que ninguém percebesse ;-) Eu acho que posso me desculpar, no entanto - eram 00:30 da manhã quando escrevi a resposta!
Andy E
1
Lembre-se de que, no Mac FF, ctrl + clique direito será exibido como um clique esquerdo do mouse (e.which === 1), enquanto no Mac Chrome ctrl + clique direito será exibido como o esperado clique direito do mouse (e.ctrlKey && e . qual === 3).
ND
8
No Chrome 59, o botão direito do mouse é acionado onmousedowne onmouseup, mas não onclick. Aparentemente, no Chrome, onclické acionado apenas para o botão esquerdo do mouse. (e sim pessoal, eu testei isso várias vezes) Para detectar um clique com o botão direito do mouse, você precisa combinar onmousedowne onmouseup/ ou usar oncontextmenu.
Venryx
27

dê uma olhada no seguinte código jQuery:

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

O valor de whichserá:

  • 1 para o botão esquerdo
  • 2 para o botão do meio
  • 3 para o botão direito
Phil Rykoff
fonte
2
Eeeew, isso é terrível! Por que .whichnão é o mesmo que .button? Oo .button=> 0,1,2 ; which=> 1,2,3 . isso está errado.
Ben Philipp
11

Você pode usar o evento window.oncontextmenu, por exemplo:

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

Radi Cho
fonte
isso também aciona o mb esquerdo
Alex
Incrível +1, agora como faço para bloquear o menu de contexto? @ user12345678
Shayan
2
@Shayan e.preventDefault ()
Brian Allan West
@BrianAllanWest Isso é jQuery? Eu não sei como usar isso. window.oncontextmenu = function () { e.preventDefault() }não funcionou.
Shayan
2
@ Shayan, não é javascript bruto ... você usaria assim ... window.oncontextmenu = function (e) {e.preventDefault ();} isso evita o comportamento padrão do navegador quando o menu de contexto (ou seja: clique com o botão direito do mouse ou segure no mac) é pressionado.
Brian Allan West
6

Sim, embora o w3c diga que o clique direito pode ser detectado pelo evento click, onClick não é acionado através do clique direito nos navegadores comuns.

De fato, clique com o botão direito apenas no gatilho onMouseDown onMouseUp e onContextMenu.

Assim, você pode considerar "onContextMenu" como o evento do botão direito. É um padrão HTML5.0.

Eric
fonte
1
Sim, parece uma ótima solução, especialmente se você estiver direcionando navegadores mais recentes. Eu não acho que este seja apenas um HTML5.0, porque até o IE 5.5 o suporta em elementos! Veja mais sobre quais navegadores apoiá-lo: quirksmode.org/dom/events/contextmenu.html
Ignas2526
5

Se você deseja detectar o clique direito do mouse, não deve usar a MouseEvent.whichpropriedade, pois ela não é padrão e há grande incompatibilidade entre os navegadores. (consulte MDN ) Você deve usar MouseEvent.button. Retorna um número representando um determinado botão:

  • 0: Botão principal pressionado, geralmente o botão esquerdo ou o estado não inicializado
  • 1: Botão auxiliar pressionado, geralmente o botão do volante ou o botão do meio (se houver)
  • 2: Botão secundário pressionado, geralmente o botão direito
  • 3: Quarto botão, geralmente o botão Voltar do navegador
  • 4: Quinto botão, geralmente o botão Avançar no navegador

MouseEvent.button lida com mais tipos de entrada do que apenas o mouse padrão:

Os botões podem ser configurados de maneira diferente para o layout "da esquerda para a direita" padrão. Um mouse configurado para uso com a mão esquerda pode ter as ações do botão invertidas. Alguns dispositivos apontadores possuem apenas um botão e usam teclado ou outros mecanismos de entrada para indicar principal, secundário, auxiliar etc. Outros podem ter muitos botões mapeados para diferentes funções e valores de botão.

Referência:

  1. https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/which
  2. https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button
AlienKevin
fonte
Desejo que esta tinha sido a primeira resposta que eu vi durante a pesquisa
Gunnar Már Óttarsson
3

Não, mas você pode detectar qual botão do mouse foi usado no evento "onmousedown" ... e a partir daí determinar se foi um "clique com o botão direito".

Timothy Khouri
fonte
@ Brian: um clique com o botão direito será acionado onmousedown, onmouseupe onclick. Se você deseja substituir o menu do botão direito, no entanto, esses eventos não são o que você deveria usar (veja minha resposta abaixo).
Andy E
2

O código a seguir está usando o jQuery para gerar um rightclickevento personalizado com base no padrão mousedowne nos mouseupeventos. Considera os seguintes pontos:

  • acionar na ativação
  • acionar somente quando pressionado o mouse no mesmo elemento antes
  • esse código também funciona especialmente no JFX Webview (já que o contextmenuevento não é acionado lá)
  • Ele não disparar quando a chave contextmenu no teclado é pressionado (como a solução com o on('contextmenu', ...)faz

$(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>

Frederic Leitenberger
fonte
1

Sim, ele é!

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
}
FrangoLeiteBomb
fonte
Bem - tecnicamente não é um "evento", mas pode ser usado.
ChickenMilkBomb
@ TimothyKhouri (e qualquer outra pessoa aqui): esta é uma função de ouvinte de evento compatível. Você passaria o próprio objeto de função como o segundo argumento para addEventListener , que o chamaria na ocorrência do evento especificado. Por exemplo:elem.addEventListener("click", doSomething)
John Weisz
1

Sim, o oncontextmenu é provavelmente a melhor alternativa, mas saiba que ele é acionado com o mouse pressionado, enquanto o clique é acionado com o mouse para cima.

Outras questões relacionadas estavam perguntando sobre o clique duplo direito - o que aparentemente não é suportado, exceto pela verificação manual do timer. Um motivo pelo qual você pode querer clicar duas vezes com o botão direito do mouse é se você precisa / deseja oferecer suporte à entrada canhota do mouse (inversão de botão). As implementações do navegador parecem fazer muitas suposições sobre como deveríamos usar os dispositivos de entrada disponíveis.

phbcanada
fonte
1

A maneira mais fácil de fazer o clique direito é usar

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

 });

No entanto, essa não é uma solução entre navegadores, os navegadores se comportam de maneira diferente para esse evento, especialmente o Firefox e o IE. Eu recomendaria abaixo para uma solução entre navegadores

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

Essa é a maneira mais fácil de acioná-lo e funciona em todos os navegadores, exceto nas visualizações da web do aplicativo como (CefSharp Chromium etc ...). Espero que meu código o ajude e boa sorte!

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>

Adnane Ar
fonte
1

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

Papoula
fonte
0

Se você deseja chamar a função enquanto o evento do botão direito significa que podemos usar os seguintes

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

<script>
function func(){
alert("Yes");
}
</script>
madhu priya
fonte
0

Isso é trabalhado comigo

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

Tente usar a propriedade whiche / oubutton

A demo

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);

Algumas informações aqui

F8ER
fonte
-1

Manipular evento usando a jQuerybiblioteca

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

Para manipular o botão direito do mouse, você pode usar o evento 'oncontextmenu'. Abaixo está um exemplo:

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

o código acima alerta algum texto quando o botão direito é pressionado. Se você não deseja que o menu padrão do navegador apareça, adicione return false; No final do conteúdo da função. Obrigado.

Sayanjyoti Das
fonte
Em vez de simplesmente responder com uma resposta que promove alguma estrutura, sua resposta seria mais útil se contivesse uma solução JS vanilla e, em seguida, talvez elaborada para descrever como seria mais fácil usar sua estrutura também.
Xaniff
Ok ... Obrigado por recomendação .. É realmente muito fácil com vanila js também
Sayanjyoti Das
-2

Sim, é um evento de remoção de javascript. Também existe um plugin jQuery para fazer isso

Teja Kantamneni
fonte