检测鼠标左键按下

Posted

技术标签:

【中文标题】检测鼠标左键按下【英文标题】:Detect left mouse button press 【发布时间】:2011-04-26 00:57:10 【问题描述】:

我讨厌这种由 W3C 和 MS 创建的鼠标按钮的混乱!我想知道当我收到 mousedown 事件时是否按下了鼠标左键。

我用这个代码

// Return true if evt carries left mouse button press
function detectLeftButton(evt) 
  // W3C
  if (window.event == null) 
    return (evt.button == 0)
  
  // IE
  else 
    return (evt.button == 1);
  

但是,它在 Opera 和 Chrome 中不起作用,因为碰巧 window.event 也存在那里。

那我该怎么办?我有一些浏览器检测,但我们都知道它不能依赖于最近一些浏览器所做的所有屏蔽。如何可靠地检测鼠标左键?

【问题讨论】:

我认为site:quirksmode.org left mouse button press 的前两个搜索结果会对您有所帮助。 我看了,里面什么都没有,只有鼠标右键的脚本 您可能想看看jQuery 是如何解决问题的,或者只是使用jQuery's mousedown 并查看event.which 的值。 我的站点中没有 jQuery,似乎 $.browser.msie 是另一个浏览器检测 阅读highest rated non-accepted answer,您将了解如何在不使用$.browser.msi 的情况下使用jQuery。 【参考方案1】:

更新的答案。以下将检测是否按下了鼠标左键且仅按下了鼠标左键:

function detectLeftButton(evt) 
    evt = evt || window.event;
    if ("buttons" in evt) 
        return evt.buttons == 1;
    
    var button = evt.which || evt.button;
    return button == 1;

有关在 javascript 中处理鼠标事件的更多信息,请尝试http://unixpapa.com/js/mouse.html

【讨论】:

这不起作用。 IE以外的所有浏览器中左键为0 这确实有效。 which 在除 IE 之外的所有浏览器中为左按钮返回 1,在该位置未定义。仅在 IE 中,我的button 变量将因此使用事件的button 属性的值,而不是which,左按钮为1。 虽然这确实有效 - 我会说这是一个非常好的解决方案 - 它仍然使用非标准化 event.which 属性。因此,具有讽刺意味的是,您使用非标准化属性来区分符合标准的浏览器和其他浏览器。 ;) @hallvors:确实。不幸的是,识别鼠标按钮(以及识别按键)是标准与浏览器实现的现实相距甚远的一个领域。 @raina77ow 我认为您适合mouseover 事件,但代码适用于mousedown 事件(jsbin.com/mupiri),这就是最初的问题。我会更新答案以检查buttons 是否存在。【参考方案2】:

现在IE9 in standards mode 和Gecko 15+ 支持W3C standard event.buttons 属性。

W3C completely stuffed 增加 event.button 属性,因此对于符合标准的浏览器 event.button 为 0,但对于在标准之前创建的浏览器,event.button 为 1。

所以代码必须避免使用event.button,旧版浏览器除外。以下代码应该可以工作:

function detectLeftButton(event) 
    if (event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) 
        return false;
     else if ('buttons' in event) 
        return event.buttons === 1;
     else if ('which' in event) 
        return event.which === 1;
     else 
        return (event.button == 1 || event.type == 'click');
    

【讨论】:

+1。这看起来像是对我的回答的改进,尽管根据要求,您可能希望与buttons 进行按位比较(例如,值 3 表示按下鼠标左键和右键)。这个特定的问题似乎暗示 OP 想知道是否按下了左按钮,而不管任何其他按钮的状态如何,因此按位比较是合适的。示例:return (event.buttons & 1) === 1; @TimDown - 我认为不需要按位检查,因为没有它,代码会更简单。从可用性来看,如果用户按下了两个按钮,那么它们的含义可能与通常的左键单击不同。出于同样的原因,在我自己的代码中,我还检查了!event.metaKey && !event.ctrlKey && !event.altKey && !event.shiftKey 以防止捕获其他点击(shift-click 与 click 不同)。【参考方案3】:

您可以使用以下代码-

onmouseup="if(window.event.which==1)//code for left click
           else if(window.event.which==3)//code for right click"

【讨论】:

没有检测到上下文菜单和右键单击。【参考方案4】:

即使 event.buttons 现在可以在 Chrome 中使用,Safari 仍然不支持它。一种解决方法是在文档或父级使用 onmousedown 和 onmouseup 事件,例如: onmousedown="bMouseDown=true" onmouseup="bMouseDown=false"

【讨论】:

【参考方案5】:
// 0 left, 2 right, 1 middle, other.. extra buttons, gaming mouses

var buttonsArray = [false, false, false, false, false, false, false, false, false];
var mousePressed = false;

document.onmousedown = function(e) 
    buttonsArray[e.button] = true;
    mousePressed = true;
;

document.onmouseup = function(e) 
    buttonsArray[e.button] = false;
    mousePressed = false;
;

document.oncontextmenu = function() 
    return false;

解释:当鼠标按下时,我们将按钮数组中的按下按钮更改为真。 当鼠标向上时,我们将按下的按钮更改为 false。

现在我们可以更准确地确定哪个按钮被按下了,但是我们遇到了右键单击问题。因为使用该按钮,我们在浏览器中打开了一个上下文菜单,而这逃脱了我们的控制...所以,我们禁用了上下文菜单为了正确检测右键单击。如果我们不这样做,我们也必须解决左键单击问题......而且它的复杂性会逃脱此响应。

为了简单起见,我们可以添加另一个变量mousePressed 并标记鼠标是向下还是向上。

在 chrome 上完美运行,我没有在其他浏览器中测试它,但我想它在 firefox 和 opera 中也可以... IE ???我不在乎 IE。

尽情享受吧!

【讨论】:

以上是关于检测鼠标左键按下的主要内容,如果未能解决你的问题,请参考以下文章

Chrome浏览器下JQuery实现鼠标左键按下移动,鼠标左键抬起停止移动功能的问题

如何在鼠标左键按下时触发循环 autoclicker c++

鼠标右键按下和放开的键代码是多少

求高手解决:js如何判断鼠标左键是不是按下?

我的鼠标左键按一下,就像是点击了两下,怎么搞的

如何在OpenGL中实现按住鼠标左键就可以旋转图形的功能