检测鼠标左键按下

IT技术 javascript google-chrome key opera mouseevent
2021-03-04 09:14:09

我讨厌 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 也存在那里。

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

5个回答

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

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

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

现在有标准模式下IE9Gecko 15+支持W3C 标准 event.buttons属性

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

您可以使用以下代码-

onmouseup="if(window.event.which==1){//code for left click}
           else if(window.event.which==3){//code for right click}"
这提供了上下文菜单并且未检测到右键单击。
2021-04-27 09:14:09

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

// 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;
}

说明:当鼠标按下时,我们将按钮数组中按下的按钮更改为 true。当鼠标向上时,我们将按下的按钮更改为 false。

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

为了简化事情,我们可以添加另一个变量mousePressed并标记鼠标是按下还是按下。

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

好好享受!