如何知道鼠标按钮的当前状态(mouseup状态或mousedown状态)

时间:2012-08-30 07:16:29

标签: javascript internet-explorer google-chrome mousedown mouseup

在Javascript中,当我点击滚动条(页面中显示的任何滚动条)并将鼠标悬停在图像上时,图像会再次开始拖动。

只应在鼠标按钮状态下拖动图像。

所以我试图通过了解鼠标按钮状态(mousedown或mouseup)来解决这个问题

此问题仅存在于 IE chrome 中,而不存在于我尝试的其他浏览器中。

使用Javascript:

document.onmousemove = mouseMove;
document.onmousedown = mouseDown;
document.onmouseup   = mouseUp;

function mouseMove(ev) {

    var mouseButtonState;
    // put code here to get mouseButtonState variable
    console.log('state of mouse is'+mouseButtonState);
}

当我移动鼠标时,程序应显示所需的值mouseButtonState 向上向下

我如何知道鼠标按钮的当前状态?

3 个答案:

答案 0 :(得分:4)

回答问题

我不太确定为什么你的系统决定在浏览器之外(或在图像之外)发生点击时拖动图像 ..以便正确回答我需要看到你的实际代码(只是鼠标事件会这样做)。但是,如果你实现了我在下面提到的系统,那么你就不应该得到你所问的问题。

更多信息

古老的Quirksmode对此有一些说法...这基本上是因为W3C无法检测到鼠标移动处理器中是否按下了左键,因为没有按下任何按钮{{1}报告0,当按下左键时 - 猜猜是什么? - e.button报告0! (适用于W3C complient浏览器)。这是我完全同意Internet Explorer的“二进制标志”实现的时候之一:

http://www.quirksmode.org/js/events_properties.html#button

获得鼠标状态的唯一方法 - 我所知道的 - 是使用e.buttonmousedown来检测和记录 - 这听起来就像你正在做的那样。现在我没有机会玩任何较新的“触摸”事件,他们可能能够帮助你......但是让它在crossbrowser上运行会很棘手。在一天结束时,有时您必须接受您在浏览器环境中工作,它将永远不会像专门设计的应用程序那样顺利。

适用于Internet Explorer的快速代码:

mouseup

适用于IE及其他任何内容的快速代码:

document.body.onmousemove = function(e){
  e = e ? e : Event;
  if ( e.button == 1 ) {
    /// mouse button is pressed
  }
}

正如其他海报所指出的那样,你可以尝试一个可以检测用户指针何时离开/重新进入浏览器环境的系统 - 但是我多年来对此的所有尝试从未如此成功。 Flash对此有更好的支持,但我怀疑你会想去那里......

旁注

就像今天可能仍然有用的一些历史信息一样,在处理拖动图像时,旧版本的Internet Explorer需要在拖动成功之前将以下内容应用于图像。这阻止了默认的浏览器拖动系统切入和阻碍。除了使用内联处理程序之外,还有更好的方法来实现它,但为了简单和清晰起见,我将其放在此处。

var delm = document.documentElement ? document.documentElement : document.body;
var buttonPressed = false;

delm.onmousdown = function(e){
  buttonPressed = true;
}

delm.onmousup = function(e){
  buttonPressed = false;
}

delm.onmousmove = function(e){
  if ( buttonPressed ) {
    /// the button is pressed, but only whilst being 
    /// detected inside the browser
  }
}

答案 1 :(得分:1)

在您描述的情况下,问题是您只处理mouseupmousedown个州。您还应该考虑处理blur事件以了解鼠标已离开对象。您可能希望为mouseup分配相同的处理程序。

答案 2 :(得分:0)

为什么不使用可以处理此类事件的jquery拖动?

如果你真的想要绑定mouseup和mousedown,你可以使用jquery

$(object).on("mouseup",function(){});