623 Stimmen

Wie man mit jQuery zwischen linkem und rechtem Mausklick unterscheidet

Wie erhalten Sie die angeklickte Maustaste mit jQuery?

$('div').bind('click', function(){
    alert('clicked');
});

Dies wird sowohl durch Rechts- als auch durch Linksklick ausgelöst. Wie kann man den rechten Mausklick abfangen? Ich würde glücklich sein, wenn etwas wie unten existiert:

$('div').bind('rightclick', function(){ 
    alert('right mouse button is pressed');
});

0 Stimmen

954voto

Acorn Punkte 46345

Ab jQuery Version 1.1.3, event.which normalisiert event.keyCode y event.charCode so dass Sie sich keine Sorgen über Probleme mit der Browserkompatibilität machen müssen. Dokumentation über event.which

event.which ergibt 1, 2 oder 3 für die linke, mittlere und rechte Maustaste:

$('#element').mousedown(function(event) {
    switch (event.which) {
        case 1:
            alert('Left Mouse button pressed.');
            break;
        case 2:
            alert('Middle Mouse button pressed.');
            break;
        case 3:
            alert('Right Mouse button pressed.');
            break;
        default:
            alert('You have a strange Mouse!');
    }
});

0 Stimmen

Ich habe Probleme gehabt mit event.which funktioniert in Chrome nicht richtig.

5 Stimmen

@Jeff Hines - Ich habe versucht, einen Rechtsklick in Chrome zu erkennen, und die hier gezeigte Implementierung schien gut zu funktionieren, aber mir wurde klar, dass das nur daran lag, dass alert() das Kontextmenü am Erscheinen hinderte :( boo

17 Stimmen

Scrollen Sie weiter nach unten und lesen Sie unbedingt den Beitrag von @JeffHines Antwort . Im Grunde hat jQuery dies als das Ereignis "contextmenu" eingebaut.

262voto

Jeff Hines Punkte 3451

Editar : Ich habe es so geändert, dass es für dynamisch hinzugefügte Elemente funktioniert, indem ich .on() in jQuery 1.7 oder höher:

$(document).on("contextmenu", ".element", function(e){
   alert('Context Menu event has fired!');
   return false;
});

デモ jsfiddle.net/Kn9s7/5

[Beginn des Originalbeitrags] So hat es bei mir funktioniert:

$('.element').bind("contextmenu",function(e){
   alert('Context Menu event has fired!');
   return false;
}); 

Für den Fall, dass Sie sich für mehrere Lösungen interessieren ^^

Editar : Tim Down weist darauf hin, dass es sich nicht immer um eine right-click die die contextmenu Ereignis, sondern auch, wenn die Taste des Kontextmenüs gedrückt wird (was wohl ein Ersatz für ein right-click )

28 Stimmen

Dies sollte die akzeptierte Antwort sein. Dieses Ereignis funktioniert in allen relevanten Browsern und wird bei einem vollständigen Klick (Maus nach unten + Maus nach oben in der Nähe) ausgelöst.

3 Stimmen

Dies ist die nur Lösung, die bei mir in Bezug auf die Erfassung des Rechtsklicks auf einen <Textbereich> funktioniert hat

17 Stimmen

Ein Rechtsklick ist jedoch nicht die einzige Möglichkeit, das Kontextmenü aufzurufen.

86voto

Russ Cam Punkte 120837

Sie können leicht feststellen, welche Maustaste gedrückt wurde, indem Sie die which Eigenschaft des Ereignisobjekts bei Mausereignissen:

/*
  1 = Left   mouse button
  2 = Centre mouse button
  3 = Right  mouse button
*/

$([selector]).mousedown(function(e) {
    if (e.which === 3) {
        /* Right mouse button was clicked! */
    }
});

4 Stimmen

Das oben verlinkte jQuery-Plugin verwendet e.button==2 stattdessen.

6 Stimmen

Jep. Verwendung von event.button Browserübergreifend ist eher ein Problem als event.which wie die Zahlen für die Schaltflächen in event.button variieren. Schauen Sie sich diesen Artikel vom Januar 2009 an - unixpapa.com/js/maus.html

1 Stimmen

Wäre es nicht besser, wenn es so wäre mouseup um zu überprüfen, ob eine Person den Artikel wirklich angeklickt hat? Wenn ich versehentlich auf etwas klicke, kann ich den Klick oft verhindern, indem ich die Maustaste gedrückt halte und außerhalb des Elements ziehe.

39voto

Naftali Punkte 141792

Sie können auch bind a contextmenu y return false :

$('selector').bind('contextmenu', function(e){
    e.preventDefault();
    //code
    return false;
});

デモ http://jsfiddle.net/maniator/WS9S2/

Oder Sie können ein schnelles Plugin erstellen, das dasselbe tut:

(function( $ ) {
  $.fn.rightClick = function(method) {

    $(this).bind('contextmenu rightclick', function(e){
        e.preventDefault();
        method();
        return false;
    });

  };
})( jQuery );

デモ http://jsfiddle.net/maniator/WS9S2/2/


使用方法 .on(...) jQuery >= 1.7:

$(document).on("contextmenu", "selector", function(e){
    e.preventDefault();
    //code
    return false;
});  //does not have to use `document`, it could be any container element.

デモ http://jsfiddle.net/maniator/WS9S2/283/

1 Stimmen

@Raynos ja, aber das ist die einzige Möglichkeit, ein Rechtsklick-Ereignis zu behandeln. Wenn das Kontextmenü noch da wäre, könnte man bei einem Rechtsklick nichts tun.

1 Stimmen

@Raynos - es gibt viele Fälle, in denen Ihr Argument nicht zutrifft, z. B. wenn Sie ein internes Tool entwickeln oder etwas für den persönlichen Gebrauch programmieren Ich bin sicher, es gibt noch mehr.

1 Stimmen

Wenn Sie tatsächlich wollten, dass es wie einer der jQuery-Event-Handler (wie Klick, zum Beispiel) zu handeln, sollte das sein method.call(this, e); 代わりに method(); Auf diese Weise, method erhält den richtigen Wert für this und hat auch das Ereignisobjekt korrekt übergeben.

30voto

TheVillageIdiot Punkte 38840

~~$("#element").live('click', function(e) { if( (!$.browser.msie && e.button == 0) || ($.browser.msie && e.button == 1) ) { alert("Left Button"); } else if(e.button == 2){ alert("Right Button"); } });~~

Update für den aktuellen Stand der Dinge:

var $log = $("div.log");
$("div.target").on("mousedown", function() {
  $log.text("Which: " + event.which);
  if (event.which === 1) {
    $(this).removeClass("right middle").addClass("left");
  } else if (event.which === 2) {
    $(this).removeClass("left right").addClass("middle");
  } else if (event.which === 3) {
    $(this).removeClass("left middle").addClass("right");
  }
});

div.target {
  border: 1px solid blue;
  height: 100px;
  width: 100px;
}

div.target.left {
  background-color: #0faf3d;
}

div.target.right {
  background-color: #f093df;
}

div.target.middle {
  background-color: #00afd3;
}

div.log {
  text-align: left;
  color: #f00;
}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="target"></div>
<div class="log"></div>

1 Stimmen

Ist dies msie-spezifisch, d.h. ist es auf andere Browser übertragbar?

13 Stimmen

Diese Methode ist nun überflüssig, da event.which wurde eingeführt, wodurch die Kompatibilität zwischen den Browsern aufgehoben wird.

8 Stimmen

Ich vermute, dass event.which die browserübergreifende Inkompatibilität tatsächlich beseitigt, aber das ist nur meine Meinung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X