Le clic droit est-il un événement Javascript?


173

Le clic droit est-il un événement Javascript? Si oui, comment l'utiliser?

Réponses:


188

Comme d'autres l'ont mentionné, le bouton droit de la souris peut être détecté via les événements habituels de la souris (mousedown, mouseup, click) . Cependant, si vous recherchez un événement de déclenchement lorsque le menu contextuel s'affiche, vous ne cherchez pas au bon endroit. Le menu contextuel / clic droit est également accessible via le clavier (Maj + F10 ou touche de menu contextuel sous Windows et certains Linux). Dans cette situation, l'événement que vous recherchez est oncontextmenu:

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

En ce qui concerne les événements de souris eux-mêmes, les navigateurs définissent une propriété sur l'objet événement accessible à partir de la fonction de gestion des événements:

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
Tout comme avec le problème which / button, le 'oncontextmenu' n'est pas implémenté de la même manière dans tous les navigateurs ... voir quirksmode.org/dom/events/contextmenu.html pour certains des 'gotchas'.
smencer

3
@AndyE Salut Andy, l'expression (isRightMB?"was not" : "")devrait être (isRightMB?"was" : "was not"). Droite ? S'il vous plaît aider à l'examiner.
Joe.wang

1
@Joe: c'est drôle comme ça a augmenté de 32 votes et 4 ans sans que personne ne s'en aperçoive ;-) Je pense que je peux être excusé, cependant - il était 00h30 quand j'ai écrit la réponse!
Andy E du

1
Gardez à l'esprit que sur Mac FF ctrl + clic droit se produira comme un clic gauche de la souris (e.which === 1), tandis que sur Mac Chrome ctrl + clic droit se produira comme le clic droit attendu de la souris (e.ctrlKey && e .qui === 3).
ND

8
Dans Chrome 59, le bouton droit de la souris déclenche onmousedownet onmouseup, mais pas onclick. Apparemment, dans Chrome, il onclickne se déclenche que pour le bouton gauche de la souris. (et oui les gars, j'ai testé cela plusieurs fois) Pour détecter un clic droit de la souris, vous devez soit combiner onmousedownet onmouseup, soit utiliser oncontextmenu.
Venryx

27

jetez un œil au code jQuery suivant:

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

La valeur de whichsera:

  • 1 pour le bouton gauche
  • 2 pour le bouton du milieu
  • 3 pour le bouton droit

2
Eeeew, c'est terrible! Pourquoi n'est-ce .whichpas le même que .button? Oo .button=> 0,1,2 ; which=> 1,2,3 . c'est tout simplement faux.
Ben Philipp

11

Vous pouvez utiliser l'événement window.oncontextmenu, par exemple:

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


cela déclenche également à gauche mb
Alex

Génial +1, maintenant comment bloquer le menu contextuel? @ user12345678
Shayan

2
@Shayan e.preventDefault ()
Brian Allan West

@BrianAllanWest Est-ce que jQuery? Je ne sais pas comment m'en servir. window.oncontextmenu = function () { e.preventDefault() }n'a pas fonctionné.
Shayan

2
@Shayan, non c'est du javascript brut ... vous l'utiliseriez comme ceci ... window.oncontextmenu = function (e) {e.preventDefault ();} cela empêche le comportement par défaut du navigateur lorsque le menu contextuel (ie: clic droit de la souris ou maintenir sur mac) est enfoncé.
Brian Allan West

6

Oui, bien que w3c indique que le clic droit peut être détecté par l'événement de clic, onClick n'est pas déclenché par un clic droit dans les navigateurs habituels.

En fait, un clic droit ne déclenche que onMouseDown onMouseUp et onContextMenu.

Ainsi, vous pouvez considérer "onContextMenu" comme l'événement de clic droit. C'est une norme HTML5.0.


1
Oui, cela semble être une excellente solution, surtout si vous ciblez des navigateurs plus récents. Je ne pense pas que ce soit uniquement du HTML5.0, car même IE 5.5 le prend en charge sur les éléments! Voici plus d'informations sur les navigateurs qui le prennent en charge: quirksmode.org/dom/events/contextmenu.html
Ignas2526

5

Si vous souhaitez détecter un clic droit de la souris, vous ne devez pas utiliser la MouseEvent.whichpropriété car elle n'est pas standard et il y a une grande incompatibilité entre les navigateurs. (voir MDN ) Vous devriez plutôt utiliser MouseEvent.button. Il renvoie un nombre représentant un bouton donné:

  • 0: Bouton principal enfoncé, généralement le bouton gauche ou l'état non initialisé
  • 1: Bouton auxiliaire enfoncé, généralement le bouton de la roue ou le bouton du milieu (si présent)
  • 2: Bouton secondaire enfoncé, généralement le bouton droit
  • 3: Quatrième bouton, généralement le bouton Précédent du navigateur
  • 4: Cinquième bouton, généralement le bouton Suivant du navigateur

MouseEvent.button gère plus de types d'entrée que la souris standard:

Les boutons peuvent être configurés différemment de la disposition standard «de gauche à droite». Une souris configurée pour une utilisation gaucher peut avoir les actions des boutons inversées. Certains périphériques de pointage n'ont qu'un seul bouton et utilisent le clavier ou d'autres mécanismes d'entrée pour indiquer les paramètres principal, secondaire, auxiliaire, etc. D'autres peuvent avoir de nombreux boutons mappés à différentes fonctions et valeurs de bouton.

Référence:

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

J'aurais aimé que ce soit la première réponse que j'ai vue lors de la recherche
Gunnar Már Óttarsson

3

Non, mais vous pouvez détecter quel bouton de la souris a été utilisé dans l'événement "onmousedown" ... et à partir de là, déterminer s'il s'agissait d'un "clic droit".


@Brian: un clic droit déclenchera onmousedown, onmouseupet onclick. Si vous envisagez de remplacer le menu contextuel, ces événements ne sont pas ce que vous devriez utiliser (voir ma réponse ci-dessous).
Andy E

2

Le code suivant utilise jQuery pour générer un rightclickévénement personnalisé basé sur la valeur par défaut mousedownet les mouseupévénements. Il considère les points suivants:

  • déclenchement sur souris
  • déclencher uniquement lorsque vous appuyez sur le bouton de la souris sur le même élément avant
  • ce code fonctionne surtout aussi dans JFX Webview (puisque l' contextmenuévénement n'y est pas déclenché)
  • il ne déclenche pas lorsque la touche contextmenu du clavier est pressé (comme la solution la - on('contextmenu', ...)t

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

Oui, ça l'est!

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
}

Eh bien - techniquement ce n'est pas un "événement" mais il peut être utilisé.
ChickenMilkBomb

@TimothyKhouri (et n'importe qui d'autre ici): c'est une fonction d'écoute d'événement compatible. Vous passeriez l'objet fonction elle - même comme second argument à addEventListener , qui serait alors appeler sur la survenance de l'événement spécifié. Par exemple:elem.addEventListener("click", doSomething)
John Weisz

1

Oui, oncontextmenu est probablement la meilleure alternative, mais sachez qu'il se déclenche lorsque la souris est enfoncée tandis que le clic se déclenche lorsque la souris est relevée.

D'autres questions connexes portaient sur le double clic droit - qui n'est apparemment pas pris en charge sauf par la vérification manuelle du minuteur. Une des raisons pour lesquelles vous voudrez peut-être pouvoir faire un double-clic droit est si vous avez besoin / souhaitez prendre en charge la saisie de la souris par la gauche (inversion de bouton). Les implémentations du navigateur semblent faire beaucoup d'hypothèses sur la façon dont nous devrions utiliser les périphériques d'entrée disponibles.


1

Le moyen le plus simple de faire un clic droit est d'utiliser

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

 });

Cependant, ce n'est pas une solution multi-navigateurs, les navigateurs se comportent différemment pour cet événement, en particulier Firefox et IE. Je recommanderais ci-dessous pour une solution multi-navigateurs

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

1

C'est le moyen le plus simple de le déclencher, et cela fonctionne sur tous les navigateurs à l'exception des vues Web d'application comme (CefSharp Chromium etc ...). J'espère que mon code vous aidera et bonne chance!

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 vous souhaitez appeler la fonction alors que l'événement de clic droit signifie que nous pouvons utiliser

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

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

0

Cela a fonctionné avec moi

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

0

Essayez d'utiliser la propriété whichet / oubutton

La démo

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

Quelques infos ici


-1

Gérer l'événement à l'aide de la jQuerybibliothèque

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

-1

Pour gérer le clic droit de la souris, vous pouvez utiliser l'événement 'oncontextmenu'. Voici un exemple:

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

le code ci-dessus alerte du texte lorsque le clic droit est enfoncé. Si vous ne souhaitez pas que le menu par défaut du navigateur apparaisse, vous pouvez ajouter return false; À la fin du contenu de la fonction. Merci.


Plutôt que de simplement répondre avec une réponse promouvant un cadre, votre réponse serait plus utile si elle contenait une solution JS vanille, puis peut-être la développer pour décrire comment il pourrait être plus facile d'utiliser votre cadre également.
Xaniff

Ok ... Merci pour la recommandation. C'est en fait très facile avec vanilA js aussi
Sayanjyoti Das

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.