代码之家  ›  专栏  ›  技术社区  ›  Sinan

如何使用jQuery区分鼠标左键和右键单击

  •  544
  • Sinan  · 技术社区  · 17 年前

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

    $('div').bind('rightclick', function(){ 
        alert('right mouse button is pressed');
    });
    
    16 回复  |  直到 6 年前
        1
  •  934
  •   Developerium Acorn    12 年前

    从jQuery版本1.1.3开始, event.which 正常化 event.keyCode event.charCode 因此,您不必担心浏览器兼容性问题。 Documentation on event.which

    事件,哪个 将分别为鼠标左键、中键和右键指定1、2或3,因此:

    $('#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!');
        }
    });
    
        2
  •  254
  •   gavit Jeff Hines    11 年前

    :我将其更改为适用于使用 .on() 在jQuery 1.7或更高版本中:

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

    演示: jsfiddle.net/Kn9s7/5

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

    以防您陷入多种解决方案^^

    当前位置Tim Down提出了一个很好的观点,那就是它并不总是会成为 right-click contextmenu 事件,但在按下上下文菜单键时也是如此(这可以说是对 )

        3
  •  85
  •   momo    13 年前

    您可以通过检查鼠标键来轻松判断按下了哪个鼠标键 which 鼠标事件上事件对象的属性:

    /*
      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
  •  39
  •   Naftali    14 年前

    你也可以 bind 到 contextmenu return false :

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

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

    或者,您可以制作一个快速插件,该插件也可以执行相同的操作:

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

    演示: http://jsfiddle.net/maniator/WS9S2/2/


    使用 .on(...)

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

        5
  •  30
  •   TheVillageIdiot    8 年前

    $("#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");
        }
    });
    

    更新内容的当前状态:

    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>
        6
  •  18
  •   Esailija    14 年前
    $.event.special.rightclick = {
        bindType: "contextmenu",
        delegateType: "contextmenu"
    };
    
    $(document).on("rightclick", "div", function() {
        console.log("hello");
        return false;
    });
    

    http://jsfiddle.net/SRX3y/8/

        7
  •  16
  •   Konstantin Dinev    13 年前

    event.button .

    事件按钮 这些代码与W3C使用的代码不同。W3C只考虑3种情况:

    1. event.button === 1
    2. 单击鼠标右键- event.button === 3
    3. 单击鼠标中键- event.button === 2

    然而,在较旧的Internet Explorer中,Microsoft正在为按下的按钮翻转一点,共有8种情况:

    1. 未单击任何按钮- event.button === 0
    2. 点击左键- event.button==1 或001
    3. 单击右键- event.button==2 或010
    4. 单击左侧和右侧按钮- 或011
    5. 点击中间按钮- event.button === 4 还是100
    6. event.button === 5 或101
    7. 单击中键和右键- event.button === 6 或110
    8. 所有3个按钮都被单击- event.button === 7 或111

    尽管理论上它应该是这样工作的,但没有一个Internet Explorer支持同时按下两个或三个按钮的情况。我之所以提到它,是因为W3C标准甚至在理论上都不能支持这一点。

        8
  •  8
  •   Community Mohan Dere    9 年前

    在我看来,稍微修改一下Villageidiot的答案会更干净:

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

    e.which 属性,分别为左键、中键和右键单击返回1、2、3。所以你也可以用 if (e.which == 3) { alert("right click"); }

    另见:问题的答案 "Triggering onclick event using middle click"

        9
  •  4
  •   callum    12 年前

    event.which === 1 确保左键单击(使用jQuery时)。

    但您还应该考虑修改器关键点: 控制键 转移 中高音

    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...
      }
    });
    
        10
  •  2
  •   user4146732 user4146732    11 年前

    还有一种方法,不用JQuery就可以做到!

    看看这个:

    document.addEventListener("mousedown", function(evt) {
        switch(evt.buttons) {
          case 1: // left mouse
          case 2: // right mouse
          case 3: // middle mouse <- I didn't tested that, I just got a touchpad
        }
    });
    
        11
  •  2
  •   Valink    6 年前

    event.which 在里面 香草JS 有棱角的 当前位置 不赞成 所以我更喜欢使用 event.buttons 相反

    用这种方法和 (穆斯敦) 活动:

    • 单击鼠标左键按 与1关联
    • 与2关联
    • 滚动按钮按下 与4关联

    和 事件将 返回相同的数字,但是 0 相反

    https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons

        12
  •  1
  •   NinjaKC    10 年前

    如果您正在寻找“更好的Javascript鼠标事件”,它允许

    • 左鼠标向下
    • 鼠标右键向下
    • 左鼠标
    • 中鼠标
    • 右滑鼠
    • 左键单击
    • 中击
    • 右击
    • 鼠标滚轮向上
    • 鼠标滚轮放下

    看看这个跨浏览器的普通javascript,它触发了上述事件,并消除了令人头痛的工作。只需将其复制并粘贴到脚本的头部,或将其包含在 <head>

    如果您对它的工作感兴趣,请查看JSFIDLE: 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);
    })();
    

    更好的鼠标点击事件示例(为了简单起见,使用jquery,但上面的内容将跨浏览器工作并触发相同的事件名称,即在名称之前使用on)

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

    对于那些需要缩小版本的人。。。

    !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)}();
    
        13
  •  1
  •   Paul Roub jim    8 年前
    $("body").on({
        click: function(){alert("left click");},
        contextmenu: function(){alert("right click");}   
    });
    
        14
  •  0
  •   nhahtdh Pankaj Wadhwa    13 年前
    $(document).ready(function () {
        var resizing = false;
        var frame = $("#frame");
        var origHeightFrame = frame.height();
        var origwidthFrame = frame.width();
        var origPosYGrip = $("#frame-grip").offset().top;
        var origPosXGrip = $("#frame-grip").offset().left;
        var gripHeight = $("#frame-grip").height();
        var gripWidth = $("#frame-grip").width();
    
        $("#frame-grip").mouseup(function (e) {
            resizing = false;
        });
    
        $("#frame-grip").mousedown(function (e) {
            resizing = true;
        });
        document.onmousemove = getMousepoints;
        var mousex = 0, mousey = 0, scrollTop = 0, scrollLeft = 0;
        function getMousepoints() {
            if (resizing) {
                var MouseBtnClick = event.which;
                if (MouseBtnClick == 1) {
                    scrollTop = document.documentElement ? document.documentElement.scrollTop : document.body.scrollTop;
                    scrollLeft = document.documentElement ? document.documentElement.scrollLeft : document.body.scrollLeft;
                    mousex = event.clientX + scrollLeft;
                    mousey = event.clientY + scrollTop;
    
                    frame.height(mousey);
                    frame.width(mousex);
                }
                else {
                    resizing = false;
                }
            }
            return true;
    
        }
    
    
    });
    
        15
  •  0
  •   Ari    11 年前

    使用jquery,您可以使用 event object type

    jQuery(".element").on("click contextmenu", function(e){
       if(e.type == "contextmenu") {
           alert("Right click");
       }
    });
    
        16
  •  0
  •   user3361174    9 年前
    $.fn.rightclick = function(func){
        $(this).mousedown(function(event){
            if(event.button == 2) {
                var oncontextmenu = document.oncontextmenu;
                document.oncontextmenu = function(){return false;};
                setTimeout(function(){document.oncontextmenu = oncontextmenu;},300);
                func(event);
                return false;
            }
        });
    };
    
    $('.item').rightclick(function(e){ 
        alert("item");
    }); 
    
        17
  •  -1
  •   Yip Man WingChun    12 年前
        $.event.special.rightclick = {
         bindType: "contextmenu",
            delegateType: "contextmenu"
          };
    
       $(document).on("rightclick", "div", function() {
       console.log("hello");
        return false;
        });
    
        18
  •  -1
  •   do loop    5 年前

    上面问 关于所有鼠标单击事件类型。

    添加此脚本,使其应用于整个页面:

    var onMousedown = function (e) {
         if (e.which === 1) {/* Left Mouse Click */}
         else if (e.which === 2) {/* Middle Mouse Click */}
         else if (e.which === 3) {/* Right Mouse Click */}
    };
    clickArea.addEventListener("mousedown", onMousedown);
    

    注意:请确保

    干杯

    推荐文章