How to distinguish between left and right mouse click with jQuery

后端 未结 17 2677
独厮守ぢ
独厮守ぢ 2020-11-21 22:36

How do you obtain the clicked mouse button using jQuery?

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

this is trigger

相关标签:
17条回答
  • 2020-11-21 22:58

    There are a lot of very good answers, but I just want to touch on one major difference between IE9 and IE < 9 when using event.button.

    According to the old Microsoft specification for event.button the codes differ from the ones used by W3C. W3C considers only 3 cases:

    1. Left mouse button is clicked - event.button === 1
    2. Right mouse button is clicked - event.button === 3
    3. Middle mouse button is clicked - event.button === 2

    In older Internet Explorers however Microsoft are flipping a bit for the pressed button and there are 8 cases:

    1. No button is clicked - event.button === 0 or 000
    2. Left button is clicked - event.button === 1 or 001
    3. Right button is clicked - event.button === 2 or 010
    4. Left and right buttons are clicked - event.button === 3 or 011
    5. Middle button is clicked - event.button === 4 or 100
    6. Middle and left buttons are clicked - event.button === 5 or 101
    7. Middle and right buttons are clicked - event.button === 6 or 110
    8. All 3 buttons are clicked - event.button === 7 or 111

    Despite the fact that this is theoretically how it should work, no Internet Explorer has ever supported the cases of two or three buttons simultaneously pressed. I am mentioning it because the W3C standard cannot even theoretically support this.

    0 讨论(0)
  • 2020-11-21 22:58

    event.which === 1 ensures it's a left-click (when using jQuery).

    But you should also think about modifier keys: ctrlcmdshiftalt

    If you're only interested in catching simple, unmodified left-clicks, you can do something like this:

    var isSimpleClick = function (event) {
      return !(
        event.which !== 1 || // not a left click
        event.metaKey ||     // "open link in new tab" (mac)
        event.ctrlKey ||     // "open link in new tab" (windows/linux)
        event.shiftKey ||    // "open link in new window"
        event.altKey         // "save link as"
      );
    };
    
    $('a').on('click', function (event) {
      if (isSimpleClick(event)) {
        event.preventDefault();
        // do something...
      }
    });
    
    0 讨论(0)
  • 2020-11-21 22:59

    As of jQuery version 1.1.3, event.which normalizes event.keyCode and event.charCode so you don't have to worry about browser compatibility issues. Documentation on event.which

    event.which will give 1, 2 or 3 for left, middle and right mouse buttons respectively so:

    $('#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 讨论(0)
  • 2020-11-21 22:59

    If you are looking for "Better Javascript Mouse Events" which allow for

    • left mousedown
    • middle mousedown
    • right mousedown
    • left mouseup
    • middle mouseup
    • right mouseup
    • left click
    • middle click
    • right click
    • mousewheel up
    • mousewheel down

    Have a look at this cross browser normal javascript which triggers the above events, and removes the headache work. Just copy and paste it into the head of your script, or include it in a file in the <head> of your document. Then bind your events, refer to the next code block below which shows a jquery example of capturing the events and firing the functions assigned to them, though this works with normal javascript binding as well.

    If your interested in seeing it work, have a look at the jsFiddle: https://jsfiddle.net/BNefn/

    /**
       Better Javascript Mouse Events
       Author: Casey Childers
    **/
    (function(){
        // use addEvent cross-browser shim: https://gist.github.com/dciccale/5394590/
        var addEvent = function(a,b,c){try{a.addEventListener(b,c,!1)}catch(d){a.attachEvent('on'+b,c)}};
    
        /* This function detects what mouse button was used, left, right, middle, or middle scroll either direction */
        function GetMouseButton(e) {
            e = window.event || e; // Normalize event variable
    
            var button = '';
            if (e.type == 'mousedown' || e.type == 'click' || e.type == 'contextmenu' || e.type == 'mouseup') {
                if (e.which == null) {
                    button = (e.button < 2) ? "left" : ((e.button == 4) ? "middle" : "right");
                } else {
                    button = (e.which < 2) ? "left" : ((e.which == 2) ? "middle" : "right");
                }
            } else {
                var direction = e.detail ? e.detail * (-120) : e.wheelDelta;
                switch (direction) {
                    case 120:
                    case 240:
                    case 360:
                        button = "up";
                    break;
                    case -120:
                    case -240:
                    case -360:
                        button = "down";
                    break;
                }
            }
    
            var type = e.type
            if(e.type == 'contextmenu') {type = "click";}
            if(e.type == 'DOMMouseScroll') {type = "mousewheel";}
    
            switch(button) {
                case 'contextmenu':
                case 'left':
                case 'middle':
                case 'up':
                case 'down':
                case 'right':
                    if (document.createEvent) {
                      event = new Event(type+':'+button);
                      e.target.dispatchEvent(event);
                    } else {
                      event = document.createEventObject();
                      e.target.fireEvent('on'+type+':'+button, event);
                    }
                break;
            }
        }
    
        addEvent(window, 'mousedown', GetMouseButton);
        addEvent(window, 'mouseup', GetMouseButton);
        addEvent(window, 'click', GetMouseButton);
        addEvent(window, 'contextmenu', GetMouseButton);
    
        /* One of FireFox's browser versions doesn't recognize mousewheel, we account for that in this line */
        var MouseWheelEvent = (/Firefox/i.test(navigator.userAgent)) ? "DOMMouseScroll" : "mousewheel";
        addEvent(window, MouseWheelEvent, GetMouseButton);
    })();
    

    Better Mouse Click Events Example (uses jquery for simplicity, but the above will work cross browser and fire the same event names, IE uses on before the names)

    <div id="Test"></div>
    <script type="text/javascript">
        $('#Test').on('mouseup',function(e){$(this).append(e.type+'<br />');})
                  .on('mouseup:left',function(e){$(this).append(e.type+'<br />');})
                  .on('mouseup:middle',function(e){$(this).append(e.type+'<br />');})
                  .on('mouseup:right',function(e){$(this).append(e.type+'<br />');})
    
                  .on('click',function(e){$(this).append(e.type+'<br />');})
                  .on('click:left',function(e){$(this).append(e.type+'<br />');})
                  .on('click:middle',function(e){$(this).append(e.type+'<br />');})
                  .on('click:right',function(e){$(this).append(e.type+'<br />');})
    
                  .on('mousedown',function(e){$(this).html('').append(e.type+'<br />');})
                  .on('mousedown:left',function(e){$(this).append(e.type+'<br />');})
                  .on('mousedown:middle',function(e){$(this).append(e.type+'<br />');})
                  .on('mousedown:right',function(e){$(this).append(e.type+'<br />');})
    
                  .on('mousewheel',function(e){$(this).append(e.type+'<br />');})
                  .on('mousewheel:up',function(e){$(this).append(e.type+'<br />');})
                  .on('mousewheel:down',function(e){$(this).append(e.type+'<br />');})
                  ;
    </script>
    

    And for those who are in need of the minified version...

    !function(){function e(e){e=window.event||e;var t="";if("mousedown"==e.type||"click"==e.type||"contextmenu"==e.type||"mouseup"==e.type)t=null==e.which?e.button<2?"left":4==e.button?"middle":"right":e.which<2?"left":2==e.which?"middle":"right";else{var n=e.detail?-120*e.detail:e.wheelDelta;switch(n){case 120:case 240:case 360:t="up";break;case-120:case-240:case-360:t="down"}}var c=e.type;switch("contextmenu"==e.type&&(c="click"),"DOMMouseScroll"==e.type&&(c="mousewheel"),t){case"contextmenu":case"left":case"middle":case"up":case"down":case"right":document.createEvent?(event=new Event(c+":"+t),e.target.dispatchEvent(event)):(event=document.createEventObject(),e.target.fireEvent("on"+c+":"+t,event))}}var t=function(e,t,n){try{e.addEventListener(t,n,!1)}catch(c){e.attachEvent("on"+t,n)}};t(window,"mousedown",e),t(window,"mouseup",e),t(window,"click",e),t(window,"contextmenu",e);var n=/Firefox/i.test(navigator.userAgent)?"DOMMouseScroll":"mousewheel";t(window,n,e)}();
    
    0 讨论(0)
  • 2020-11-21 23:01

    You can easily tell which mouse button was pressed by checking the which property of the event object on mouse events:

    /*
      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! */
        }
    });
    
    0 讨论(0)
  • 2020-11-21 23:02

    It seems to me that a slight adaptation of TheVillageIdiot's answer would be cleaner:

    $('#element').bind('click', function(e) {
      if (e.button == 2) {
        alert("Right click");
      }
      else {
        alert("Some other click");
      }
    }
    

    EDIT: JQuery provides an e.which attribute, returning 1, 2, 3 for left, middle, and right click respectively. So you could also use if (e.which == 3) { alert("right click"); }

    See also: answers to "Triggering onclick event using middle click"

    0 讨论(0)
提交回复
热议问题