检测鼠标左键是否按下

Bor*_*nov 31 javascript opera google-chrome key mouseevent

我讨厌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);
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,它在Opera和Chrome中不起作用,因为它也发生在window.event中.

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

Tim*_*own 41

更新的答案.以下将检测是否按下了左键和鼠标左键:

function detectLeftButton(evt) {
    evt = evt || window.event;
    if ("buttons" in evt) {
        return evt.buttons == 1;
    }
    var button = evt.which || evt.button;
    return button == 1;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这确实有效.除了IE之外,`which`在所有浏览器中的左按钮返回1,其中它将是未定义的.因此,在IE中,我的`button`变量将使用事件的`button`属性的值而不是`which`,左按钮为1. (5认同)
  • 这不起作用.除IE之外,所有浏览器中的左键均为0 (2认同)
  • 虽然这确实有效 - 我什至可以说这是一个非常好的解决方案 - 它仍然使用非标准化的 event.which 属性。因此,具有讽刺意味的是,您使用非标准化属性来区分符合标准的浏览器和其他浏览器。;) (2认同)
  • @hallvors:的确如此.不幸的是,识别鼠标按钮(以及识别按键)是标准与浏览器实现的现实相距甚远的一个领域. (2认同)

rob*_*cat 11

现在有一个W3C标准 event.buttons的支持的属性IE9在标准模式下,和壁虎15+.

W3C完全塞满了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');
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @TimDown - 我认为不需要按位检查,因为没有它,代码更简单.从可用性来看,如果用户有两个按钮,那么可能他们的意思是左击通常意味着什么.出于同样的原因,在我自己的代码中我也检查`!event.metaKey &&!event.ctrlKey &&!event.altKey &&!event.shiftKey`以防止捕获其他点击(shift-click与点击不同). (2认同)