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

Sin*_*nan 567 javascript jquery right-click javascript-events

如何使用jQuery获取单击的鼠标按钮?

$('div').bind('click', function(){
    alert('clicked');
});
Run Code Online (Sandbox Code Playgroud)

这是由左右键单击触发的,能够捕获鼠标右键的方式是什么?如果存在以下内容,我会很高兴:

$('div').bind('rightclick', function(){ 
    alert('right mouse button is pressed');
});
Run Code Online (Sandbox Code Playgroud)

Aco*_*orn 885

从jQuery版本1.1.3开始,event.which规范化event.keyCode,event.charCode因此您不必担心浏览器兼容性问题.关于的文件event.which

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!');
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 继续向下滚动并确保阅读@ JeffHines的[答案](http://stackoverflow.com/questions/1206203/how-to-distinguish-between-left-and-right-mouse-click-with-jquery/4963381# 4963381).基本上,jQuery将此内置作为事件'contextmenu'. (15认同)
  • @jpadvo jQuery没有将它构建为"contextmenu",`contextmenu`是浏览器的原生.在本机JavaScript中,您可以附加到`oncontextmenu`事件. (8认同)
  • ie8:无法获取属性'which'的值:object为null或undefined (6认同)
  • @Jeff海因斯 - 我是想检测在Chrome中点击右键,在这里显示的实施似乎做工精细,但我意识到,那只是因为警报()出现阻止了上下文菜单.:(嘘 (4认同)
  • 事件被触发后,我可以阻止上下文菜单出现吗? (2认同)

Jef*_*nes 249

编辑:我将其更改为适用.on()于jQuery 1.7或更高版本中使用的动态添加元素:

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

演示:jsfiddle.net/Kn9s7/5

[原始帖子的开头]这对我有用:

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

如果你进入多个解决方案^^

编辑:Tim Down提出了一个很好的观点,它并不总是会right-click触发contextmenu事件,而且当按下上下文菜单键时(这可以说是一个替代right-click)

  • 这应该是公认的答案.此事件适用于所有相关浏览器和触发器的整个点击(鼠标按下+鼠标向上移动). (28认同)
  • 右键单击不是触发上下文菜单的唯一方法. (16认同)
  • 这是*唯一*解决方案,对我捕获<textarea>上的右键单击 (3认同)
  • 我认为这是错误的方法,因为`contextmenu`事件触发并不总是暗示单击鼠标右键.正确的方法是从鼠标事件中获取按钮信息(在这种情况下为"click"). (3认同)

Rus*_*Cam 83

您可以通过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! */
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 是的.使用`event.button`交叉浏览器比`event.which`更有问题,因为`event.button`中按钮的数字不同.请查看2009年1月的这篇文章 - http://unixpapa.com/js/mouse.html (6认同)
  • 上面链接的jQuery插件改为使用`e.button == 2`. (3认同)

Nea*_*eal 38

你也bind可以contextmenureturn false:

$('selector').bind('contextmenu', function(e){
    e.preventDefault();
    //code
    return false;
});
Run Code Online (Sandbox Code Playgroud)

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

或者你可以制作一个同样的快速插件:

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

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

  };
})( jQuery );
Run Code Online (Sandbox Code Playgroud)

演示: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.
Run Code Online (Sandbox Code Playgroud)

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


The*_*iot 30

$("#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");
    }
});
Run Code Online (Sandbox Code Playgroud)

更新当前状态:

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");
  }
});
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="target"></div>
<div class="log"></div>
Run Code Online (Sandbox Code Playgroud)

  • 现在不需要这种方法,因为引入了`event.which`,这消除了跨浏览器的兼容性. (13认同)
  • 我怀疑event.which实际上消除了跨浏览器的不兼容性,但那只是我. (8认同)

Esa*_*ija 18

$.event.special.rightclick = {
    bindType: "contextmenu",
    delegateType: "contextmenu"
};

$(document).on("rightclick", "div", function() {
    console.log("hello");
    return false;
});
Run Code Online (Sandbox Code Playgroud)

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


Kon*_*nev 15

有很多非常好的答案,但我只是想在使用时触及IE9和IE <9之间的一个主要区别event.button.

根据旧的Microsoft规范,event.button代码与W3C使用的规范不同.W3C仅考虑3个案例:

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

在较旧的Internet Explorer中,微软在按下按钮时略微翻了一下,有8种情况:

  1. 没有点击按钮 - event.button === 0或000
  2. 单击左键 - event.button === 1或001
  3. 单击右键 - event.button === 2或010
  4. 单击左右按钮 - event.button === 3或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标准在理论上甚至不能支持这一点.

  • 所以按下按钮就会得到`event.button === 0`,没有点击按钮,很棒的IE`ಠ_ಠ` (6认同)

Dan*_*ton 8

在我看来,对TheVillageIdiot的回答略有改动会更清晰:

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

编辑:JQuery提供一个e.which属性,分别为左,中,右三次返回1,2,3.所以你也可以使用if (e.which == 3) { alert("right click"); }

另请参阅:"使用中键单击触发onclick事件"的答案