Déclencher un événement onclick à l'aide du clic du milieu

90

J'utilise l' onclickévénement d'un lien haché pour ouvrir <div>un pop-up. Mais le clic du milieu ne déclenche pas l' onclickévénement mais prend uniquement la hrefvaleur d'attribut du lien et charge l'URL dans une nouvelle page. Comment puis-je utiliser le clic du milieu pour ouvrir le en <div>tant que popup?

Sadesh Kumar N
la source
15
Je ne comprends toujours pas comment le problème a été résolu, lorsque le clic du milieu ne déclenche pas l'événement onclick.
Tomáš Zato - Réintégrer Monica
3
@ Les navigateurs TomášZato ne déclenchent pas un événement «clic» avec un clic du milieu, mais ils peuvent déclencher un événement «mouseup». Ensuite, le framework javascript peut lier cela à une action de «clic» pour vous confondre. Je recommande la lecture de unixpapa.com/js/mouse.html
rds

Réponses:

64

ÉDITER

Cette réponse est obsolète et ne fonctionne pas sur Chrome. Vous finirez probablement par utiliser l' événement auxlink , mais veuillez vous référer aux autres réponses ci-dessous.

/ÉDITER


La réponse de beggs est correcte, mais il semble que vous vouliez empêcher l'action par défaut du clic du milieu. Dans ce cas, incluez les éléments suivants

$("#foo").on('click', function(e) {
   if (e.which == 2) {
      e.preventDefault();
      alert("middle button"); 
   }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a id="foo" href="http://example.com">middle click me</a>

preventDefault () arrêtera l'action par défaut de l'événement.

Gausie
la source
19
Gardez à l'esprit que cela a .liveété abandonné et supprimé au profit de.on
Naftali aka Neal
2
Pour moi, FF fonctionne uniquement avec l'événement mousedown. L'événement de clic appelle cette chose scr.hu/1kig/su5c9
l00k
1
Existe-t-il une constante inter-navigateurs pour cela 2?
fracz
11
Cela ne fonctionne plus dans Chrome 55. Voir 1 , 2 et cette question
billc.cn
1
Comment est-ce une solution lorsque le problème était que le clic du milieu ne déclenche pas l'événement de clic pour commencer?
Drazen Bjelovuk
31

Pour que le bouton du clic central / molette de la souris soit détecté, vous devez utiliser l'événement auxclick. Par exemple:

<a href="https://example.com" onauxclick="func()" id="myLink"></a>

Puis dans votre fichier script

function func(e) {
  if (e.button == 1) {
    alert("middle button clicked")
  }
}

Si vous voulez le faire à partir de JavaScript (sans utiliser l'attribut HTML onauxclick), alors vous allez addEventListenerà l'élément:

let myLink = document.getElementById('myLink')
myLink.addEventListener('auxclick', function(e) {
  if (e.button == 1) {
    alert("middle button clicked")
  }
})
<a id="myLink" href="http://example.com">middle click me</a>

Consultez la page mdn sur l' auxclickévénement ici .

Hassan
la source
note: onauxclick fonctionnera mais cela n'ouvre pas le lien dans un nouvel onglet ...
Jonathan Laliberte
2
C'est la seule réponse qui fonctionne réellement dans Chrome. Si vous avez besoin d'un événement "clic" pour le bouton droit de la souris, vous pouvez utiliser le "menu contextuel" (bien qu'il ne soit pas seulement déclenché par un clic droit): developer.mozilla.org/en-US/docs/Web/API/Element/...
Humpparitari
1
En combinant avec la réponse ci-dessus, vous pouvez empêcher la capture de clic droit par if(event.button==1)clause, c'est la seule réponse de travail.
Buddy
Notez que vous devez utiliser à la fois l' auxclickévénement et vérifier la valeur de e.button == 1. J'ai édité la réponse.
Flimm
26

Vous pouvez utiliser

event.button

pour identifier le bouton de la souris sur lequel vous avez cliqué.

Renvoie une valeur entière indiquant le bouton dont l'état a changé.

  • 0 pour un 'clic' standard, généralement bouton gauche
  • 1 pour le bouton du milieu, généralement un clic sur la molette
  • 2 pour le bouton droit, généralement un clic droit

Notez que cette convention n'est pas suivie dans Internet Explorer: voir QuirksMode pour plus de détails.

L'ordre des boutons peut être différent en fonction de la configuration du périphérique de pointage.

Lire aussi

Quel bouton de la souris a été cliqué?

Il existe deux propriétés pour savoir quel bouton de la souris a été cliqué: quel et bouton. Veuillez noter que ces propriétés ne fonctionnent pas toujours sur un événement de clic. Pour détecter en toute sécurité un bouton de la souris, vous devez utiliser les événements mousedown ou mouseup.

document.getElementById('foo').addEventListener('click', function(e) {
  console.log(e.button);
  e.preventDefault();
});
<a id="foo" href="http://example.com">middle click me</a>

rahul
la source
4
Je recommanderais de l'utiliser event.whichcar il a été standardisé sur tous les navigateurs dans la source jQuery - ligne 2756 -if ( !event.which && event.button ) event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
Russ Cam
2
@RussCam Cependant, MouseEvent.whichn'est défini dans aucune spécification, mais MouseEvent.buttonest défini dans les événements DOM L2.
Oriol
@Oriol est correct, mais mis en œuvre différemment selon les différents fournisseurs de navigateurs. L'OP a étiqueté la question avec jQuery, c'est pourquoi j'ai suggéré d'utiliser event.whichmais j'aurais dû préciser que cela MouseEvent.whichne fait pas partie de la spécification officielle.
Russ Cam
@rahul, qu'en est-il des souris de jeu avec plus de 7 boutons? egg-tech.com/blog/images/mouse%20buttons.jpg
Pacerier
En fait, cela ne fonctionne pas dans les navigateurs comme Firefox ou Chrome, uniquement pour le clic principal. Voir 1 , 2 et cette question .
Flimm
8

Je déteste généralement quand les gens proposent des alternatives au lieu de solutions, mais comme des solutions ont déjà été fournies, je vais enfreindre ma propre règle.

Les sites Web où la fonction de clic du milieu est annulée ont tendance à vraiment, vraiment me déranger. Je clique généralement avec le milieu parce que je souhaite ouvrir le nouveau contenu dans un nouvel onglet tout en ayant une vue dégagée du contenu actuel. Chaque fois que vous pouvez laisser la fonctionnalité de clic central seule et rendre le contenu pertinent disponible via l'attribut HREF de votre élément cliqué, je crois fermement que c'est ce que vous devez faire.

Tom Haflinger
la source
mais que faire si vous avez des onglets sur votre page Web et que vous voulez le même comportement que dans votre navigateur? middleclick devrait alors fermer un onglet existant.
cmxl
6

jQuery fournit un .whichattribut sur l'événement qui donne l'ID du bouton de gauche à droite comme 1, 2, 3. Dans ce cas, vous voulez 2.

Usage:

$("#foo").live('click', function(e) { 
   if( e.which == 2 ) {
      alert("middle button"); 
   }
}); 

La réponse d'Adamantium fonctionnera également, mais vous devez faire attention à IE comme il le note:

$("#foo").live('click', function(e) { 
   if((!$.browser.msie && e.button == 1) || ($.browser.msie && e.button == 2)) { 
     alert("middle button"); 
   } 
});

Rappelez-vous également que l' .buttonattribut est indexé 0 et non indexé 1 comme .which.

supplie
la source
puis-je remplacer la fonctionnalité du navigateur mozilla !! par exemple, sur un clic gauche, il ouvre une fenêtre contextuelle .... mais pour le clic du milieu, il n'ouvre pas de fenêtre contextuelle et un nouvel onglet est ouvert dans lequel la fenêtre contextuelle ne s'ouvre pas .. donc je veux remplacer une fonctionnalité de clic du milieu de mozilla ....
Sadesh Kumar N
Mozilla a un paramètre pour ouvrir toutes les fenêtres contextuelles dans un nouvel onglet plutôt qu'une nouvelle fenêtre. Si l'utilisateur a cette option activée, je ne pense pas que vous puissiez faire quoi que ce soit. Si ce n'est pas ce qui se passe, pouvez-vous publier un code ou un lien vers la page du problème?
supplie
Cela ne fonctionne pas dans les navigateurs comme Firefox et Chrome.
Flimm
6

Cette question est un peu ancienne, mais j'ai trouvé une solution:

$(window).on('mousedown', function(e) {
   if( e.which == 2 ) {
      e.preventDefault();
   }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a href="http://example.com">middle click me</a>

Chrome ne déclenche pas l'événement "clic" pour la molette de la souris

Travailler dans FF et Chrome

Bastien Bast Weber
la source
Je ne veux pas assumer votre cas d'utilisation, mais je parierais que beaucoup de gens auraient besoin de l'événement 'mouseup' à la place. Cela fonctionne également avec le bouton central de la souris.
Bojidar Stanchev
Lorsque j'essaye cela dans Firefox et Chrome, cela n'empêche pas le comportement par défaut d'ouvrir le lien dans un nouvel onglet, même s'il e.preventDefault()est appelé.
Flimm
5

La méthode appropriée consiste à utiliser .on, comme cela .livea été déconseillé, puis supprimé de jQuery:

$("#foo").on('click', function(e) { 
   if( e.which == 2 ) {
      e.preventDefault();
      alert("middle button"); 
   }
});

Ou si vous voulez la sensation "en direct" et #foon'est pas sur votre page au début du document:

$(document).on('click', '#foo', function(e) { 
   if( e.which == 2 ) {
      e.preventDefault();
      alert("middle button"); 
   }
});

réponse originale

Naftali alias Neal
la source
L'événement clickne fonctionne pas pour le bouton central de la souris dans les navigateurs comme Firefox et Chrome.
Flimm
il a l'habitude de @Flimm
Naftali aka Neal
Ouais. Stack Overflow n'a pas de bonne solution pour les réponses obsolètes. J'ai peur de devoir voter contre parce que "Cette réponse n'est plus utile". Ce qui est pire, c'est que la réponse épinglée peut avoir des centaines ou des milliers de votes négatifs car elle est obsolète, et elle restera toujours épinglée si le PO ne répond pas.
Flimm
Posez une nouvelle question :-) (référencez celle-ci en disant qu'elle est obsolète et que vous voulez une réponse 2020) Mais peut-être aussi utiliser des événements mousedown / mouseup?
Naftali aka Neal
Même si je fais cela, des gens comme moi vont toujours rencontrer cette réponse en venant des moteurs de recherche, et vont être déroutés par la mauvaise réponse épinglée.
Flimm
3

Je sais que je suis en retard pour la fête, mais pour ceux qui ont encore des problèmes avec la gestion du clic du milieu, vérifiez si vous déléguez l'événement. En cas de délégation, l' clickévénement ne se déclenche pas. Comparer:

Cela fonctionne pour les clics du milieu:

$('a').on('click', function(){
  console.log('middle click');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a href="http://example.com">middle click me</a>

Cela ne fonctionne pas pour les clics du milieu:

$('div').on('click', 'a', function(){
  alert('middle click');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>
  <a href="http://example.com">middle click here</a>
</div>

Si vous avez toujours besoin de suivre le clic du milieu à l' aide de la délégation d'événements , le seul moyen de contourner, comme indiqué dans le ticket jQuery correspondant , est d'utiliser mousedownou à la mouseupplace. Ainsi:

Cela fonctionne pour les clics intermédiaires délégués:

$('div').on('mouseup', 'a', function(){
  console.log('middle click');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>
  <a href="http://example.com">middle click me</a>
</div>

Consultez-le en ligne ici .

sauter405
la source
En fait, clickne fonctionne pas pour les clics du milieu comme dans votre premier exemple.
Flimm