¿Es el clic derecho en un evento Javascript?


173

¿Es el clic derecho en un evento Javascript? Si es así, ¿cómo lo uso?

Respuestas:


188

Como otros han mencionado, el botón derecho del mouse se puede detectar a través de los eventos usuales del mouse (mousedown, mouseup, click) . Sin embargo, si está buscando un evento de disparo cuando aparece el menú del botón derecho, está buscando en el lugar equivocado. También se puede acceder al menú contextual / clic derecho mediante el teclado (shift + F10 o tecla de menú contextual en Windows y algunos Linux). En esta situación, el evento que está buscando es oncontextmenu:

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

En cuanto a los eventos del mouse, los navegadores establecen una propiedad para el objeto del evento que es accesible desde la función de manejo 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


55
Al igual que con el problema de qué / botón, el 'oncontextmenu' no se implementa de la misma manera en todos los navegadores ... vea quirksmode.org/dom/events/contextmenu.html para algunas de las 'trampas'.
smencer

3
@AndyE Hola Andy, la expresión (isRightMB?"was not" : "")debería ser (isRightMB?"was" : "was not"). Derecho ? Por favor, ayuda a revisarlo.
Joe.wang

1
@ Joe: es curioso cómo eso aumentó 32 votos y 4 años sin que nadie se diera cuenta ;-) Sin embargo, creo que puedo ser excusado, ¡eran las 00:30 am cuando escribí la respuesta!
Andy E

1
Tenga en cuenta que en Mac FF ctrl + clic derecho aparecerá como un clic izquierdo del mouse (p. Ej., Que === 1), mientras que en Mac Chrome ctrl + clic derecho aparecerá como clic derecho del mouse esperado (e.ctrlKey && e .que === 3).
ND

8
En Chrome 59, se activa el botón derecho del mouse onmousedowny onmouseup, pero no onclick. Aparentemente, en Chrome, onclicksolo se activa para el botón izquierdo del mouse. (y sí chicos, he probado esto varias veces) para detectar un derecho-clic del ratón, usted tiene que combinar ambos onmousedowny onmouseup, o el uso oncontextmenu.
Venryx

27

Eche un vistazo al siguiente código jQuery:

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

El valor de whichserá:

  • 1 para el botón izquierdo
  • 2 para el botón central
  • 3 para el botón derecho

2
Eeeew, eso es terrible! ¿Por qué .whichno es lo mismo que .button? Oo .button=> 0,1,2 ; which=> 1,2,3 . Eso está mal.
Ben Philipp

11

Puede usar el evento window.oncontextmenu, por ejemplo:

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


esto también dispara mb dejado
Alex

Impresionante +1, ahora ¿cómo bloqueo el menú contextual? @ user12345678
Shayan

2
@Shayan e.preventDefault ()
Brian Allan West

@BrianAllanWest ¿Es eso jQuery? No sé cómo usar eso. window.oncontextmenu = function () { e.preventDefault() }no funcionó
Shayan

2
@Shayan, no, es JavaScript sin procesar ... lo usaría así ... window.oncontextmenu = function (e) {e.preventDefault ();} esto evita el comportamiento predeterminado del navegador cuando el menú contextual (es decir: presiona el botón derecho del mouse o mantén presionado en Mac).
Brian Allan West el

6

Sí, aunque w3c dice que el evento de clic puede detectar el clic derecho, onClick no se activa a través del clic derecho en los navegadores habituales.

De hecho, haga clic con el botón derecho solo en ActivarMouseDown onMouseUp y onContextMenu.

Por lo tanto, puede considerar "onContextMenu" como el evento de clic derecho. Es un estándar HTML5.0.


1
Sí, suena como una gran solución, especialmente si está apuntando a navegadores más nuevos. ¡No creo que sea solo HTML5.0, porque incluso IE 5.5 lo admite en elementos! Aquí hay más sobre qué navegadores lo admiten: quirksmode.org/dom/events/contextmenu.html
Ignas2526

5

Si desea detectar el clic derecho del mouse, no debe usar la MouseEvent.whichpropiedad, ya que no es estándar y existe una gran incompatibilidad entre los navegadores. (ver MDN ) En su lugar, debe usar MouseEvent.button. Devuelve un número que representa un botón dado:

  • 0: Botón principal presionado, generalmente el botón izquierdo o el estado no inicializado
  • 1: Botón auxiliar presionado, generalmente el botón de la rueda o el botón central (si está presente)
  • 2: Botón secundario presionado, generalmente el botón derecho
  • 3: Cuarto botón, generalmente el botón Atrás del navegador
  • 4: Quinto botón, generalmente el botón Reenviar del navegador

MouseEvent.button maneja más tipos de entrada que solo el mouse estándar:

Los botones pueden configurarse de manera diferente al diseño estándar de "izquierda a derecha". Un mouse configurado para uso con la mano izquierda puede tener las acciones del botón invertidas. Algunos dispositivos señaladores solo tienen un botón y usan el teclado u otros mecanismos de entrada para indicar principal, secundario, auxiliar, etc. Otros pueden tener muchos botones asignados a diferentes funciones y valores de botones.

Referencia:

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

Ojalá esta hubiera sido la primera respuesta que vi al buscar
Gunnar Már Óttarsson

3

No, pero puede detectar qué botón del mouse se usó en el evento "onmousedown" ... y a partir de ahí determinar si fue un "clic derecho".


@ Brian: un clic derecho se disparará onmousedown, onmouseupy onclick. Sin embargo, si está buscando anular el menú del botón derecho, estos eventos no son lo que debería usar (consulte mi respuesta a continuación).
Andy E

2

El siguiente código usa jQuery para generar un rightclickevento personalizado basado en los eventos predeterminados mousedowny mouseup. Considera los siguientes puntos:

  • disparar al mouseup
  • disparar solo cuando se presiona el mousedown sobre el mismo elemento antes
  • este código también funciona especialmente en JFX Webview (ya que el contextmenuevento no se activa allí)
  • No se dispara cuando se pulsa la tecla contextual en el teclado (como la solución con el on('contextmenu', ...)hace

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

¡Sí lo es!

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
}

Bueno, técnicamente no es un "evento" pero se puede usar.
ChickenMilkBomb

@TimothyKhouri (y cualquier otra persona aquí): esta es una función de escucha de eventos compatible. Debería pasar el objeto de función en sí mismo como el segundo argumento para agregarEventListener , que luego lo llamaría cuando ocurriera el evento especificado. Por ejemplo:elem.addEventListener("click", doSomething)
John Weisz

1

Sí, oncontextmenu es probablemente la mejor alternativa, pero tenga en cuenta que se dispara con el mouse hacia abajo, mientras que el clic se disparará con el mouse hacia arriba.

Otras preguntas relacionadas se referían al doble clic derecho, que aparentemente no es compatible, excepto mediante la verificación manual del temporizador. Una razón por la que es posible que desee tener doble clic derecho es si necesita / desea admitir la entrada del mouse para zurdos (inversión de botones). Las implementaciones del navegador parecen hacer muchas suposiciones sobre cómo deberíamos usar los dispositivos de entrada disponibles.


1

La forma más fácil de hacer clic derecho es usar

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

 });

Sin embargo, esta no es una solución de navegador cruzado, los navegadores se comportan de manera diferente para este evento, especialmente firefox e IE. Recomendaría a continuación para una solución de navegador cruzado

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

1

Esa es la forma más fácil de activarlo, y funciona en todos los navegadores, excepto en las vistas web de aplicaciones como (CefSharp Chromium, etc.). ¡Espero que mi código te ayude y buena suerte!

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

Si desea llamar a la función mientras hace clic con el botón derecho, significa que podemos usar los siguientes

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

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

0

Esto se trabajó conmigo

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

0

Intenta usar la propiedad whichy / obutton

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

Alguna información aquí


-1

Manejar evento usando la jQuerybiblioteca

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

-1

Para manejar el clic derecho con el mouse, puede usar el evento 'oncontextmenu'. A continuación se muestra un ejemplo:

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

el código anterior alerta un poco de texto cuando se presiona el botón derecho. Si no desea que aparezca el menú predeterminado del navegador, puede agregar return false; Al final del contenido de la función. Gracias.


En lugar de simplemente responder con una respuesta que promocione algún marco, su respuesta sería más útil si contuviera una solución JS de vainilla, y luego tal vez elaborara para describir cómo podría ser más fácil usar su marco también.
Xaniff

Ok ... Gracias por la recomendación ... En realidad es muy fácil con vanilA js también
Sayanjyoti Das

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.