如何使用jQuery获取鼠标点击的按钮?
$('div').bind('click', function(){
alert('clicked');
});
这是通过右键和左键触发的,有什么方法可以捕捉到右键单击吗?如果下面的类似方法存在,我会很高兴:
$('div').bind('rightclick', function(){
alert('right mouse button is pressed');
});
如何使用jQuery获取鼠标点击的按钮?
$('div').bind('click', function(){
alert('clicked');
});
这是通过右键和左键触发的,有什么方法可以捕捉到右键单击吗?如果下面的类似方法存在,我会很高兴:
$('div').bind('rightclick', function(){
alert('right mouse button is pressed');
});
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!');
}
});
contextmenu
是浏览器本身的功能。在原生JavaScript中,您可以附加到oncontextmenu
事件。 - Naftali编辑: 我修改了代码,使其能够处理使用jQuery 1.7或更高版本的.on()
动态添加的元素:
$(document).on("contextmenu", ".element", function(e){
alert('Context Menu event has fired!');
return false;
});
[原始帖子开始] 这是对我有用的方法:
$('.element').bind("contextmenu",function(e){
alert('Context Menu event has fired!');
return false;
});
如果你想要多种解决方案^^
编辑: Tim Down 提出了一个很好的观点,即不一定会通过right-click
来触发contextmenu
事件,还有可能是按下上下文菜单键(这可以看作是替代right-click
)
contextmenu
事件的触发并不总是意味着右键被点击。正确的方法是从鼠标事件(在这种情况下是 click
)中获取按钮信息。 - Tim Down通过检查鼠标事件对象的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! */
}
});
e.button==2
。 - ceejayozevent.which
比使用event.button
更容易跨浏览器兼容,因为在event.button
中用于表示按钮的数字是不同的。请参考这篇2009年1月的文章 - http://unixpapa.com/js/mouse.html - Russ Cammouseup
用于验证用户是否真正点击了该项?有很多情况下,如果我不小心点击了某个元素,我可以通过按住鼠标按钮并将其拖到元素外部来防止点击。 - Chris Marisicmouseup
可能是更好的事件,这只是使用event.which
处理鼠标按钮点击的示例。 - Russ Cam您还可以绑定
到contextmenu
并返回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/
使用 jQuery >= 1.7的 .on(...)
:
$(document).on("contextmenu", "selector", function(e){
e.preventDefault();
//code
return false;
}); //does not have to use `document`, it could be any container element.
method.call(this, e);
而不是 method();
这样,method
就可以正确地获取 this
的值,并且也可以正确地传递事件对象。 - Jeremy T$("#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
已经被引入,消除了跨浏览器兼容性问题,因此该方法现在已不再必要。 - Acorn$.event.special.rightclick = {
bindType: "contextmenu",
delegateType: "contextmenu"
};
$(document).on("rightclick", "div", function() {
console.log("hello");
return false;
});
有很多非常好的答案,但我想强调IE9和IE< 9在使用event.button
时的一个主要区别。
根据旧版Microsoft规范中event.button
的代码与W3C使用的代码不同。W3C只考虑了三种情况:
event.button === 1
event.button === 3
event.button === 2
然而在早期的Internet Explorer版本中,Microsoft针对按下的按钮反转了位,共有8个选项:
event.button === 0
或000event.button === 1
或001event.button === 2
或010event.button === 3
或011event.button === 4
或100event.button === 5
或101event.button === 6
或110event.button === 7
或111尽管这理论上是应该的,但没有任何一个Internet Explorer版本支持同时按下两个或三个按钮的情况。我提到这一点是因为W3C标准甚至在理论上也无法支持此操作。
event.button === 0
的结果,表示没有按钮被点击。这在IE浏览器中表现得相当出色 ಠ_ಠ
。 - Sinanevent.buttons
。它还处理鼠标按钮4和5(在浏览器中前进/后退)。请参阅:https://jsfiddle.net/9hponw1t/1 - mbomb007$('#element').bind('click', function(e) {
if (e.button == 2) {
alert("Right click");
}
else {
alert("Some other click");
}
}
编辑:JQuery提供了一个e.which
属性,分别返回1、2、3表示左键、中键和右键单击。因此,您也可以使用if (e.which == 3) { alert("right click"); }
另请参阅:"使用中键触发onclick事件"的答案。
event.which
的人:它现在已经被弃用,因此最好使用event.buttons
代替。event.which === 1
确保这是一个左键单击(使用jQuery时)。
但是您还应该考虑修改键:ctrlcmdshiftalt
如果您只想捕获简单的、未修改的左键单击,可以像这样做:
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...
}
});