2010-03-09 19 views

risposta

123

Come altri hanno menzionato, il pulsante destro del mouse può essere rilevato through the usual mouse events (mousedown, mouseup, click). Tuttavia, se stai cercando un evento di attivazione quando viene attivato il menu di scelta rapida, stai cercando nel posto sbagliato. Il tasto destro del mouse/menu di scelta rapida è accessibile anche tramite la tastiera (MAIUSC + F10 o tasto menu di scelta rapida su Windows e alcuni Linux). In questa situazione, l'evento che si sta cercando è oncontextmenu:

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

Per quanto riguarda gli eventi del mouse stessi, i browser impostare una proprietà per l'oggetto evento che è accessibile dalla funzione di gestione degli eventi:

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

Proprio come con il problema di/button, il 'oncontextmenu' non è implementato lo stesso in tutti i browser ... vedi http://www.quirksmode.org/dom/events/contextmenu.html per alcuni dei 'gotchas' . – smencer

+2

@AndyE Ciao Andy, l'espressione '(isRightMB?" Non era ":" ")' dovrebbe essere '(isRightMB?"was": "was not") '. Destra ? Si prega di aiutare a rivederlo. –

+1

@Joe: divertente come è andato 32 voti e 4 anni senza che nessuno se ne accorga ;-) Penso di poter essere scusato, però - erano le 00:30 quando ho scritto la risposta! –

1

Sì, lo è!

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 
} 
+0

Beh, tecnicamente non è un "evento" ma può essere utilizzato. – ChickenMilkBomb

+1

Il tuo codice non mostra affatto come qualcuno chiamerebbe questo ... –

+0

@TimothyKhouri (e chiunque altro qui): questa è una funzione listener di eventi compatibile. Si passerebbe l'oggetto funzione stesso come secondo argomento a [addEventListener] (https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener), che quindi lo chiamerebbe _call_ sul verificarsi di l'evento specificato. Ad esempio: 'elem.addEventListener (" click ", doSomething)' –

3

No, ma è possibile rilevare quale pulsante del mouse è stato utilizzato nel caso "onMouseDown" ... e da lì a determinare se si trattava di un "tasto destro del mouse".

+0

quindi dovrebbe un clic con il tasto destro attivare un evento onclick? – Brian

+0

Hai ragione, sarebbe onmousedown. –

+0

@Brian: un clic con il tasto destro del mouse attiverà 'onmousedown',' onmouseup' e 'onclick'. Se stai cercando di ignorare il menu di scelta rapida, tuttavia, questi eventi non sono quelli che dovresti usare (vedi la mia risposta sotto). –

-2

Sì, è un evento javascript mousedown. C'è anche un jQuery plugin per farlo

19

un'occhiata al seguente codice jQuery:

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

Il valore di which sarà:

  • per il pulsante sinistro
  • per il tasto centrale
  • per il tasto destro
+2

Eeeew, è terribile! Perché '.which' non è uguale a' .button'? O.o '.button' => * 0,1,2 *; 'which' => * 1,2,3 *. è semplicemente sbagliato. –

4

Ya, anche se w3c dice che il clic destro può essere rilevato dall'evento click, onClick non viene attivato tramite il clic destro in browser abituali

Infatti, fare clic con il tasto destro del mouse su triggerMouseDown onMouseUp e onContextMenu.

Pertanto, è possibile considerare "onContextMenu" come l'evento del clic destro. È uno standard HTML5.0.

+1

Sì, sembra un'ottima soluzione, specialmente se stai mirando ai browser più recenti. Non penso che questo sia solo HTML5.0, perché anche IE 5.5 lo supporta sugli elementi! Ecco di più su quali browser lo supportano: http://www.quirksmode.org/dom/events/contextmenu.html – Ignas2526

0

evento maniglia usando jQuery biblioteca

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

Sì, oncontextmenu è probabilmente la migliore alternativa, ma essere consapevoli che si innesca al passaggio del mouse verso il basso, mentre clicca attiverà il mouse verso l'alto.

Altre domande correlate riguardavano il doppio clic destro - che apparentemente non è supportato se non tramite il controllo manuale del timer. Un motivo per cui si potrebbe desiderare di avere il doppio clic è se è necessario/desidera supportare l'input del mouse mancino (inversione del pulsante). Le implementazioni del browser sembrano fare molte supposizioni su come dovremmo usare i dispositivi di input disponibili.

5

La mia risposta è window.oncontextmenu, ad esempio:

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

2

Il seguente codice utilizza jQuery per generare un evento personalizzato rightclick basato sul predefinito mousedown e mouseup eventi. Essa considera i seguenti punti:

  • grilletto su mouseup
  • grilletto solo quando premuto mousedown sullo stesso elemento prima
  • questo codice particolare funziona anche in JFX Webview (dal momento che l'evento contextmenu non viene attivato lì)
  • non innesca quando si preme il tasto menu contestuale sulla tastiera (come la soluzione con il on('contextmenu', ...) fa

$(function() 
 
{ // global rightclick handler - trigger custom event "rightclick" 
 
\t var mouseDownElements = []; 
 
\t $(document).on('mousedown', '*', function(event) 
 
\t { 
 
\t \t if (event.which == 3) 
 
\t \t { 
 
\t \t \t mouseDownElements.push(this); 
 
\t \t } 
 
\t }); 
 
\t $(document).on('mouseup', '*', function(event) 
 
\t { 
 
\t \t if (event.which == 3 && mouseDownElements.indexOf(this) >= 0) 
 
\t \t { 
 
\t \t \t $(this).trigger('rightclick'); 
 
\t \t } 
 
\t }); 
 
\t $(document).on('mouseup', function() 
 
\t { 
 
\t \t mouseDownElements.length = 0; 
 
\t }); 
 
    // disable contextmenu 
 
    $(document).on('contextmenu', function(event) 
 
\t { 
 
\t \t event.preventDefault(); 
 
\t }); 
 
}); 
 

 

 

 
// 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>

0

Se si desidera chiamare la funzione, mentre il tasto destro evento ci consente di utilizzare i seguenti

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

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

Per gestire tasto destro del mouse, è possibile utilizzare l'evento 'oncontextmenu'. Di seguito è riportato un esempio:

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

il codice sopra avvisa del testo quando si preme il tasto destro del mouse. Se non si desidera visualizzare il menu predefinito del browser, è possibile aggiungere return false; Alla fine del contenuto della funzione. Grazie.

+0

Piuttosto che rispondere semplicemente con una risposta che promuova un framework, la tua risposta sarebbe più utile se contenesse un JS vanigliato soluzione, e quindi forse elaborato su di esso per descrivere come potrebbe essere più facile utilizzare il framework pure. – Xaniff

+0

Ok ... Grazie per la segnalazione .. In realtà è molto facile anche con vanilA js –

0

modo più semplice per fare clic destro fatto sta usando

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

}); 

Tuttavia questa non è una soluzione cross browser, i browser si comportano diversamente per questo evento particolare Firefox e IE. Vorrei raccomandare sotto per una soluzione cross browser

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