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

IT技术 javascript jquery jquery-events right-click
2021-01-17 07:03:07

你如何使用jQuery获得点击的鼠标按钮?

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

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

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

从 jQuery 1.1.3 版开始,event.which规范化event.keyCodeevent.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!');
    }
});
ie8:无法获取属性“which”的值:对象为空或未定义
2021-03-12 07:03:07
@Jeff Hines - 我试图检测 Chrome 中的右键单击,此处显示的实现似乎工作正常,但我意识到那只是因为 alert() 阻止了上下文菜单出现。:(嘘
2021-03-15 07:03:07
@jpadvo jQuery 没有将它构建为“上下文菜单”,它contextmenu是浏览器的本机。在原生 JavaScript 中,您可以附加到oncontextmenu事件。
2021-03-15 07:03:07
我可以阻止在事件触发后出现上下文菜单吗?
2021-03-28 07:03:07
继续向下滚动并确保阅读@JeffHines 的回答基本上,jQuery 将此内置为事件“​​上下文菜单”。
2021-04-03 07:03:07

编辑:我将其更改为适用于.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事件,而且在按下上下文菜单键时也是如此(这可以说是 a 的替代品right-click

嘿!谢谢,这看起来很棒,但我无法将它绑定到表格行甚至正文等元素。它适用于 $(window)。我使用backbone.js用新内容等填充区域#main。
2021-03-11 07:03:07
这是在捕获 <textarea> 上的右键单击方面对我有用唯一解决方案
2021-03-21 07:03:07
这应该是公认的答案。此事件适用于所有相关浏览器,并在整个点击(鼠标按下 + 鼠标向上接近)时触发。
2021-03-27 07:03:07
我认为这是错误的方法,因为contextmenu事件触发并不总是意味着单击了鼠标右键。正确的方法是从鼠标事件中获取按钮信息(click在这种情况下)。
2021-03-30 07:03:07
但是,右键单击并不是触发上下文菜单的唯一方法。
2021-04-03 07:03:07

您可以通过检查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! */
    }
});
上面链接的 jQuery 插件正在使用e.button==2
2021-03-28 07:03:07
是的。使用event.button跨浏览器比event.which用于按钮的数字event.button不同更成问题看一下 2009 年 1 月的这篇文章 - unixpapa.com/js/mouse.html
2021-03-29 07:03:07
@ChrisMarisicmouseup可能是一个更好的事件,这只是使用event.which鼠标按钮单击的示例
2021-03-31 07:03:07
mouseup验证一个人真的点击了该项目不是更好吗?很多时候如果我不小心点击了某些东西,我可以通过按住鼠标按钮并拖动到元素之外来阻止点击。
2021-04-07 07:03:07

您还bind可以contextmenureturn 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(...)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/

@Raynos 是的,但这是处理右键单击事件的唯一方法。如果上下文菜单仍然存在,那么右键单击您将无法执行任何操作。
2021-03-10 07:03:07
@Raynos - 在很多情况下,您的观点是无效的,例如构建内部工具,或为您自己的个人使用编写代码......我相信还有更多
2021-03-29 07:03:07
如果您确实希望它像 jQuery 事件处理程序之一(例如单击)一样工作,那么应该method.call(this, e);代替method();That way,method获取正确的值this并正确地将事件对象传递给它。
2021-03-30 07:03:07
@JeremyT 是真的...你可以以任何你想要的方式处理回调^_^
2021-04-09 07:03:07

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

这种方法现在是不必要的,因为event.which已经引入了它消除了跨浏览器兼容性。
2021-03-17 07:03:07
我怀疑 event.which 实际上消除了跨浏览器不兼容,但这只是我。
2021-03-18 07:03:07
这是特定于 msie 的吗?即它是否可以跨其他浏览器移植?
2021-03-29 07:03:07