Attivazione dell'evento onclick utilizzando il clic centrale


90

Sto usando l' onclickevento di un collegamento con hash per aprire <div>un popup. Ma il clic centrale non attiva l' onclickevento ma prende solo il hrefvalore dell'attributo del collegamento e carica l'URL in una nuova pagina. Come posso utilizzare il clic centrale per aprire <div>come popup?


15
Continuo a non capire come sia stato risolto il problema, quando il clic centrale non attiva l'evento onclick.
Tomáš Zato - Ripristina Monica il

3
@ TomášZato I browser non attivano un evento "clic" con un clic centrale, ma potrebbero attivare un evento "mouseup". Quindi il framework javascript potrebbe associarlo a un'azione di "clic" per confonderti. Vi consiglio la lettura di unixpapa.com/js/mouse.html
RDS

Risposte:


64

MODIFICARE

Questa risposta è stata deprecata e non funziona su Chrome. Molto probabilmente finirai per utilizzare l' evento auxlink , ma fai riferimento alle altre risposte di seguito.

/MODIFICARE


La risposta di mendicanti è corretta, ma sembra che tu voglia impedire l'azione predefinita del clic centrale. In tal caso, includere quanto segue

$("#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 () interromperà l'azione predefinita dell'evento.


19
Tieni presente che è .livestato deprecato e rimosso a favore di.on
Naftali aka Neal il

2
Per me FF funziona solo con l'evento mousedown. L'evento clic chiama questa cosa scr.hu/1kig/su5c9
l00k

1
Esiste una costante cross-browser per questo 2?
fracz

11
Questo non funziona più in Chrome 55. Vedi 1 , 2 e questa domanda
billc.cn

1
In che modo questa è una soluzione quando il problema era che il clic centrale non attiva l'evento clic per cominciare?
Drazen Bjelovuk

31

Affinché il pulsante centrale del clic / rotellina del mouse venga rilevato, è necessario utilizzare l'evento auxclick. Per esempio:

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

Quindi nel tuo file di script

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

Se vuoi farlo da JavaScript (senza usare l'attributo HTML onauxclick), allora vai addEventListenerall'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>

Controlla la pagina mdn auxclicksull'evento qui .


nota: onauxclick funzionerà ma non apre il collegamento in una nuova scheda ...
Jonathan Laliberte

2
Questa è l'unica risposta che funziona effettivamente in Chrome. Se hai bisogno di un evento "clic" per il pulsante destro del mouse, puoi utilizzare "contextmenu" (sebbene non venga attivato solo dal clic destro): developer.mozilla.org/en-US/docs/Web/API/Element/…
Humpparitari

1
combinando con la risposta di cui sopra, è possibile impedire l'acquisizione del clic destro per if(event.button==1)clausola, questa è l'unica risposta funzionante.
Buddy

Notare che è necessario utilizzare sia l' auxclickevento sia per verificare il valore di e.button == 1. Ho modificato la risposta.
Flimm

26

Puoi usare

event.button

per identificare quale pulsante del mouse è stato cliccato.

Restituisce un valore intero che indica il pulsante che ha cambiato stato.

  • 0 per il "clic" standard, solitamente il pulsante sinistro
  • 1 per il pulsante centrale, generalmente clic con la rotellina
  • 2 per il pulsante destro, solitamente clic con il pulsante destro del mouse

Nota che questa convenzione non viene seguita in Internet Explorer: vedi QuirksMode per i dettagli.

L'ordine dei pulsanti può essere diverso a seconda di come è stato configurato il dispositivo di puntamento.

Leggi anche

Quale pulsante del mouse è stato cliccato?

Ci sono due proprietà per scoprire quale pulsante del mouse è stato cliccato: quale e pulsante. Tieni presente che queste proprietà non funzionano sempre su un evento clic. Per rilevare in modo sicuro un pulsante del mouse è necessario utilizzare gli eventi 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>


4
Ti consiglio di utilizzarlo event.whichpoiché è stato standardizzato su tutti i browser nel sorgente jQuery - riga 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 Tuttavia, MouseEvent.whichnon è definito in nessuna specifica, ma MouseEvent.buttonè definito negli eventi DOM L2.
Oriol

@Oriol corretto, ma implementato in modo diverso tra diversi fornitori di browser. L'OP ha etichettato la domanda con jQuery, quindi è per questo che ho suggerito di utilizzarlo, event.whichma avrebbe dovuto elaborare che MouseEvent.whichnon fa parte delle specifiche ufficiali.
Russ Cam

@rahul, che dire dei mouse da gioco con più di 7 pulsanti? egg-tech.com/blog/images/mouse%20buttons.jpg
Pacerier

In realtà, questo non funziona in browser come Firefox o Chrome, solo per il clic principale. Vedi 1 , 2 e questa domanda .
Flimm

8

Di solito odio quando le persone offrono alternative invece di soluzioni, ma poiché le soluzioni sono già state fornite infrangerò la mia regola.

I siti web in cui la funzione di clic centrale è sovrascritta tendono a infastidirmi davvero. Di solito faccio clic con il pulsante centrale perché desidero aprire il nuovo contenuto in una nuova scheda pur avendo una visione senza ostacoli del contenuto corrente. Ogni volta che puoi lasciare da sola la funzionalità del clic centrale e rendere disponibile il contenuto pertinente tramite l'attributo HREF del tuo elemento cliccato, credo fermamente che sia quello che dovresti fare.


ma cosa succede se hai delle schede sulla tua pagina web e desideri lo stesso comportamento del tuo browser? middleclick dovrebbe chiudere una scheda esistente quindi.
cmxl

6

jQuery fornisce un .whichattributo sull'evento che fornisce l'id del pulsante di clic da sinistra a destra come 1, 2, 3. In questo caso si desidera 2.

Utilizzo:

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

Anche la risposta di Adamantium funzionerà, ma devi stare attento a IE mentre osserva:

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

Ricorda anche che l' .buttonattributo è 0-indicizzato non 1-indicizzato come .which.


posso ignorare la funzionalità del browser mozilla !! ad es. al clic sinistro si apre un popup .... ma per il clic centrale non apre un popup e viene aperta una nuova scheda in cui il popup non si apre .. quindi desidero sovrascrivere una funzionalità di clic centrale di mozilla ....
Sadesh Kumar N

Mozilla ha un'impostazione per aprire tutti i popup in una nuova scheda piuttosto che in una nuova finestra. Se l'utente ha questa opzione abilitata, non penso che tu possa fare nulla. Se questo non è ciò che sta accadendo, puoi inserire del codice o un collegamento alla pagina del problema?
mendica il

Questo non funziona in browser come Firefox e Chrome.
Flimm

6

Questa domanda è un po 'vecchia, ma ho trovato una soluzione:

$(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 non attiva l'evento "clic" per la rotellina del mouse

Lavora in FF e Chrome


Non voglio presumere il tuo caso d'uso, ma scommetterei che molte persone avrebbero effettivamente bisogno dell'evento "mouseup". Funziona anche con il pulsante centrale del mouse.
Bojidar Stanchev

Quando provo questo in Firefox e Chrome, non impedisce il comportamento predefinito di aprire il collegamento in una nuova scheda, anche se e.preventDefault()viene chiamato.
Flimm

5

Il metodo corretto è quello di utilizzare .on, poiché .liveè stato deprecato e quindi rimosso da jQuery:

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

O se vuoi la sensazione "live" e #foonon è sulla tua pagina all'inizio del documento:

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

risposta originale


L'evento clicknon funziona per il pulsante centrale del mouse in browser come Firefox e Chrome.
Flimm

era solito @Flimm
Naftali aka Neal il

Si. Stack Overflow non offre una buona soluzione per le risposte obsolete. Temo di dover votare in negativo perché "Questa risposta non è più utile". Quel che è peggio è che la risposta bloccata può avere centinaia o migliaia di voti negativi perché non è aggiornata e rimarrà comunque bloccata per sempre se l'OP non risponde.
Flimm

Fai una nuova domanda :-) (fai riferimento a questa dicendo che non è aggiornata e vuoi una risposta per il 2020). Ma è anche possibile utilizzare eventi mousedown / mouseup?
Naftali aka Neal

Anche se lo faccio, le persone come me continueranno a trovare questa risposta quando provengono dai motori di ricerca e saranno confuse dalla risposta sbagliata appuntata.
Flimm

3

So di essere in ritardo per la festa, ma per coloro che hanno ancora problemi con la gestione del clic centrale, controlla se deleghi l'evento. In caso di delega, l' clickevento non si attiva. Confrontare:

Funziona per i clic centrali:

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

Questo non funziona per i clic centrali:

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

Se hai ancora bisogno di monitorare il clic centrale utilizzando la delega dell'evento , l'unico modo per aggirare, come indicato nel ticket jQuery corrispondente , è utilizzare mousedowno mouseupinvece. Così:

Funziona per i clic centrali delegati:

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

Guardalo online qui .


In realtà, clicknon funziona per i clic centrali come nel tuo primo esempio.
Flimm
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.