有没有办法在 JavaScript 中检测鼠标按钮当前是否按下?
我知道“鼠标按下”事件,但这不是我需要的。按下鼠标按钮一段时间后,我希望能够检测它是否仍然被按下。
这可能吗?
有没有办法在 JavaScript 中检测鼠标按钮当前是否按下?
我知道“鼠标按下”事件,但这不是我需要的。按下鼠标按钮一段时间后,我希望能够检测它是否仍然被按下。
这可能吗?
关于 Pax 的解决方案:如果用户有意或无意地单击了多个按钮,则不起作用。不要问我是怎么知道的:-(。
正确的代码应该是这样的:
var mouseDown = 0;
document.body.onmousedown = function() {
++mouseDown;
}
document.body.onmouseup = function() {
--mouseDown;
}
通过这样的测试:
if(mouseDown){
// crikey! isn't she a beauty?
}
如果您想知道按下了哪个按钮,请准备好使 mouseDown 成为一个计数器数组,并为单独的按钮分别计数:
// let's pretend that a mouse doesn't have more than 9 buttons
var mouseDown = [0, 0, 0, 0, 0, 0, 0, 0, 0],
mouseDownCount = 0;
document.body.onmousedown = function(evt) {
++mouseDown[evt.button];
++mouseDownCount;
}
document.body.onmouseup = function(evt) {
--mouseDown[evt.button];
--mouseDownCount;
}
现在您可以检查准确按下了哪些按钮:
if(mouseDownCount){
// alright, let's lift the little bugger up!
for(var i = 0; i < mouseDown.length; ++i){
if(mouseDown[i]){
// we found it right there!
}
}
}
现在请注意,上面的代码仅适用于向您传递从 0 开始的按钮编号的符合标准的浏览器。IE 使用当前按下按钮的位掩码:
所以相应地调整你的代码!我把它留作练习。
请记住:IE 使用一个名为……“事件”的全局事件对象。
顺便说一句,IE 有一个对您有用的功能:当其他浏览器仅针对鼠标按钮事件(onclick、onmousedown 和 onmouseup)发送“按钮”时,IE 也会使用 onmousemove 发送它。因此,当您需要知道按钮状态时,您可以开始监听 onmousemove,并在获得 evt.button 后立即检查它——现在您知道按下了哪些鼠标按钮:
// for IE only!
document.body.onmousemove = function(){
if(event.button){
// aha! we caught a feisty little sheila!
}
};
当然,如果她装死不动,你什么也得不到。
相关链接:
更新 #1:我不知道为什么我继承了 document.body 风格的代码。将事件处理程序直接附加到文档会更好。
这是一个老问题,这里的答案似乎主要提倡使用mousedown
并mouseup
跟踪按钮是否被按下。但正如其他人指出的那样,mouseup
只有在浏览器中执行时才会触发,这可能导致无法跟踪按钮状态。
但是,MouseEvent(现在)指示当前按下了哪些按钮:
MouseEvent.buttons
MouseEvent.which
(对于 Safaributtons
将是未定义的) 注意:which
使用与buttons
右键和中键单击不同的数字。当在 上注册时document
,mousemove
一旦光标重新进入浏览器,就会立即触发,因此如果用户在外面释放,那么一旦他们将鼠标移回内部,状态就会更新。
一个简单的实现可能如下所示:
var leftMouseButtonOnlyDown = false;
function setLeftButtonState(e) {
leftMouseButtonOnlyDown = e.buttons === undefined
? e.which === 1
: e.buttons === 1;
}
document.body.onmousedown = setLeftButtonState;
document.body.onmousemove = setLeftButtonState;
document.body.onmouseup = setLeftButtonState;
如果需要更复杂的场景(不同的按钮/多个按钮/控制键),请查看 MouseEvent 文档。当/如果 Safari 提升它的游戏,这应该会变得更容易。
我认为最好的方法是保留自己的鼠标按钮状态记录,如下所示:
var mouseDown = 0;
document.body.onmousedown = function() {
mouseDown = 1;
}
document.body.onmouseup = function() {
mouseDown = 0;
}
然后,稍后在您的代码中:
if (mouseDown == 1) {
// the mouse is down, do what you have to do.
}
解决方案不好。可以在文档上“按下鼠标”,然后在浏览器外“按下鼠标”,在这种情况下,浏览器仍会认为鼠标已按下。
唯一好的解决方案是使用 IE.event 对象。
我知道这是一篇旧帖子,但我认为使用鼠标向上/向下跟踪鼠标按钮感觉有点笨拙,所以我找到了一个可能吸引某些人的替代方法。
<style>
div.myDiv:active {
cursor: default;
}
</style>
<script>
function handleMove( div ) {
var style = getComputedStyle( div );
if (style.getPropertyValue('cursor') == 'default')
{
// You're down and moving here!
}
}
</script>
<div class='myDiv' onmousemove='handleMove(this);'>Click and drag me!</div>
:active 选择器比鼠标向上/向下处理鼠标点击要好得多,您只需要一种在 onmousemove 事件中读取该状态的方法。为此,我需要作弊并依赖于默认光标是“自动”的事实,我只是将其更改为“默认”,这是默认情况下自动选择的。
您可以使用 getComputedStyle 返回的对象中的任何内容,您可以将其用作标志而不会影响页面的外观,例如边框颜色。
我本来希望在 :active 部分设置我自己的用户定义样式,但我无法让它工作。如果可以的话就更好了。