Activación del evento onclick usando el clic central

90

Estoy usando el onclickevento de un enlace hash para abrir <div>una ventana emergente. Pero el clic del medio no desencadena el onclickevento, solo toma el hrefvalor del atributo del enlace y carga la URL en una nueva página. ¿Cómo puedo usar el clic central para abrir el <div>como una ventana emergente?

Sadesh Kumar N
fuente
15
Sigo sin entender cómo se resolvió el problema, cuando el clic central no activa el evento onclick.
Tomáš Zato - Reincorporación a Monica
3
@ TomášZato Los navegadores no activan un evento de 'clic' con un clic del medio, pero pueden activar un evento de 'mouseup'. Entonces, el marco de JavaScript puede vincular esto a una acción de 'clic' para confundirlo. Recomiendo la lectura de unixpapa.com/js/mouse.html
rds

Respuestas:

64

EDITAR

Esta respuesta ha quedado obsoleta y no funciona en Chrome. Lo más probable es que termine utilizando el evento auxlink , pero consulte otras respuestas a continuación.

/EDITAR


La respuesta de Beggs es correcta, pero parece que desea evitar la acción predeterminada del clic central. En cuyo caso, incluya lo siguiente

$("#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 () detendrá la acción predeterminada del evento.

Gausie
fuente
19
Tenga en cuenta que .livefue obsoleto y eliminado a favor de.on
Naftali también conocido como Neal
2
Para mí, FF solo funciona con el evento mousedown. El evento de clic llama a esto scr.hu/1kig/su5c9
l00k
1
¿Hay alguna constante entre navegadores para eso 2?
fracz
11
Esto ya no funciona en Chrome 55. Consulte 1 , 2 y esta pregunta
billc.cn
1
¿Cómo es esto una solución cuando el problema era que el clic del medio no activa el evento de clic para empezar?
Drazen Bjelovuk
33

Para que se detecte el botón de clic central / rueda del mouse, debe usar el evento auxclick. P.ej:

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

Luego en su archivo de script

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

Si desea hacerlo desde JavaScript (sin usar el atributo HTML onauxclick), entonces vaya addEventListeneral elemento:

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>

Consulte la página de mdn sobre el auxclickevento aquí .

Hassan
fuente
nota: onauxclick funcionará pero no abre el enlace en una nueva pestaña ...
Jonathan Laliberte
2
Esta es la única respuesta que realmente funciona en Chrome. Si necesita un evento de "clic" para el botón derecho del mouse, puede usar el "menú contextual" (aunque no solo se activa con el clic derecho): developer.mozilla.org/en-US/docs/Web/API/Element/…
Humpparitari
1
Combinando con la respuesta anterior, puede evitar la captura del clic derecho por if(event.button==1)cláusula, esta es la única respuesta que funciona.
Buddy
Tenga en cuenta que necesita usar tanto el auxclickevento como verificar el valor de e.button == 1. Edité la respuesta.
Flimm
26

Puedes usar

event.button

para identificar en qué botón del mouse se hizo clic.

Devuelve un valor entero que indica el botón que cambió de estado.

  • 0 para 'clic' estándar, generalmente botón izquierdo
  • 1 para el botón central, generalmente clic con la rueda
  • 2 para el botón derecho, generalmente clic derecho

Tenga en cuenta que esta convención no se sigue en Internet Explorer: consulte QuirksMode para obtener más detalles.

El orden de los botones puede ser diferente según cómo se haya configurado el dispositivo señalador.

También leer

¿En qué botón del mouse se hizo clic?

Hay dos propiedades para averiguar en qué botón del mouse se ha hecho clic: cuál y botón. Tenga en cuenta que estas propiedades no siempre funcionan en un evento de clic. Para detectar de forma segura un botón del mouse, debe usar los eventos mousedown o 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
fuente
4
Recomiendo usarlo event.whichya que se ha estandarizado en todos los navegadores en la fuente jQuery - línea 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 Sin embargo, MouseEvent.whichno está definido en ninguna especificación, pero MouseEvent.buttonestá definido en DOM L2 Events.
Oriol
@Oriol correcto, pero implementado de manera diferente en diferentes proveedores de navegadores. El OP etiquetó la pregunta con jQuery, por eso sugerí usar event.whichpero debería haber elaborado que MouseEvent.whichno es parte de la especificación oficial.
Russ Cam
@rahul, ¿qué pasa con los ratones para juegos con más de 7 botones? egg-tech.com/blog/images/mouse%20buttons.jpg
Pacerier
En realidad, esto no funciona en navegadores como Firefox o Chrome, solo para el clic principal. Consulte 1 , 2 y esta pregunta .
Flimm
8

Por lo general, odio cuando la gente ofrece alternativas en lugar de soluciones, pero como las soluciones ya se han proporcionado, voy a romper mi propia regla.

Los sitios web donde se anula la función de clic central tienden a molestarme mucho, realmente. Por lo general, hago clic en el medio porque quiero abrir el nuevo contenido en una nueva pestaña mientras tengo una vista sin obstáculos del contenido actual. Siempre que pueda dejar la funcionalidad del clic central sola y hacer que el contenido relevante esté disponible a través del atributo HREF del elemento en el que hizo clic, creo firmemente que eso es lo que debe hacer.

Tom Haflinger
fuente
1
pero, ¿qué sucede si tiene pestañas en su página web y desea el mismo comportamiento que en su navegador? middleclick debería cerrar una pestaña existente entonces.
cmxl
6

jQuery proporciona un .whichatributo en el evento que da la identificación del botón de clic de izquierda a derecha como 1, 2, 3. En este caso, desea 2.

Uso:

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

La respuesta de Adamantium también funcionará, pero debe tener cuidado con IE como señala:

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

También recuerde que el .buttonatributo tiene un índice 0, no un índice 1 como .which.

suplica
fuente
¿Puedo anular la funcionalidad del navegador mozilla? por ejemplo, al hacer clic con el botón izquierdo, abre una ventana emergente ... pero para el clic central no abre una ventana emergente y se abre una nueva pestaña en la que la ventana emergente no se abre ... así que quiero anular una funcionalidad de clic central de mozilla ....
Sadesh Kumar N
Mozilla tiene una configuración para abrir todas las ventanas emergentes en una nueva pestaña en lugar de una nueva ventana. Si el usuario tiene esta opción habilitada, no creo que haya nada que pueda hacer. Si esto no es lo que está sucediendo, ¿puede publicar algún código o un enlace a la página del problema?
ruega el
Esto no funciona en navegadores como Firefox y Chrome.
Flimm
6

Esta pregunta es un poco vieja, pero encontré una solución:

$(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 no activa el evento "clic" para la rueda del mouse

Trabaja en FF y Chrome

Bastien Bast Weber
fuente
No quiero asumir su caso de uso, pero apuesto dinero a que mucha gente realmente necesitaría el evento 'mouseup' en su lugar. También funciona con el botón central del mouse.
Bojidar Stanchev
Cuando intento esto en Firefox y Chrome, no previene el comportamiento predeterminado de abrir el enlace en una nueva pestaña, aunque e.preventDefault()se llame.
Flimm
5

El método adecuado es usar .on, ya que .livese ha desaprobado y luego se eliminó de jQuery:

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

O si desea la sensación de "en vivo" y #foono está en su página al inicio del documento:

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

respuesta original

Naftali alias Neal
fuente
El evento clickno funciona para el botón central del mouse en navegadores como Firefox y Chrome.
Flimm
solía @Flimm
Naftali alias Neal
Si. Stack Overflow no tiene una buena solución para las respuestas desactualizadas. Me temo que tengo que votar en contra porque "Esta respuesta ya no es útil". Lo que es peor es que la respuesta fijada puede tener cientos o miles de votos negativos porque está desactualizada, y permanecerá fijada para siempre si el OP no responde.
Flimm
Haga una nueva pregunta :-) (haga referencia a esta diciendo que está desactualizada y que desea una respuesta de 2020). ¿Pero también puede usar eventos mousedown / mouseup?
Naftali alias Neal
Incluso si hago eso, la gente como yo todavía se encontrará con esta respuesta cuando provenga de los motores de búsqueda y se confundirá con la respuesta incorrecta.
Flimm
3

Sé que llego tarde a la fiesta, pero para aquellos que todavía tienen problemas con el manejo del clic central, verifique si delega el evento. En caso de delegación, el clickevento no se dispara. Comparar:

Esto funciona para clics intermedios:

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

Esto no funciona para clics intermedios:

$('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 aún necesita rastrear el clic central usando la delegación de eventos , la única forma de evitarlo, como se indica en el ticket de jQuery correspondiente , es usar mousedowno en su mouseuplugar. Al igual que:

Esto funciona para clics intermedios delegados:

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

Véalo en línea aquí .

skip405
fuente
En realidad, clickno funciona para clics intermedios como en su primer ejemplo.
Flimm