有没有一种方法可以在JavaScript中检测鼠标按钮是否正在按下?
我知道"mousedown"事件,但那不是我需要的。我想在鼠标按钮按下后的一段时间内,能够检测它是否仍然按下。
这个可能吗?
有没有一种方法可以在JavaScript中检测鼠标按钮是否正在按下?
我知道"mousedown"事件,但那不是我需要的。我想在鼠标按钮按下后的一段时间内,能够检测它是否仍然按下。
这个可能吗?
var mouseDown = 0;
document.body.onmousedown = function() {
++mouseDown;
}
document.body.onmouseup = function() {
--mouseDown;
}
有这样的测试:
if(mouseDown){
// crikey! isn't she a beauty?
}
// 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!
}
}
}
// for IE only!
document.body.onmousemove = function(){
if(event.button){
// aha! we caught a feisty little sheila!
}
};
当她装死不动的时候,你什么也得不到。
相关链接:
更新#1:我不知道为什么我会带上document.body-style的代码。直接将事件处理程序附加到文档中会更好。
event.buttons
直接插入您正在使用的任何事件触发器中,而无需外部保存变量。我提出了一个全新的问题(因为我的 mouseup 事件并不总是触发,所以这个解决方案对我不起作用),然后在最多5分钟内得到了那个答案。 - RoboticRenaissance这是一个旧问题,这里的答案似乎大多主张使用mousedown
和mouseup
来跟踪按钮是否被按下。但正如其他人指出的,mouseup
只会在浏览器内执行时触发,这可能会导致丢失按钮状态。
然而,MouseEvent(现在)指示当前按下哪些按钮:
MouseEvent.buttons
MouseEvent.which
(对于Safari来说,buttons
将未定义)。注意:which
对于右键和中键单击使用与buttons
不同的数字。当在document
上注册时,mousemove
将立即在光标重新进入浏览器时触发,因此如果用户在外部释放,则状态将在他们鼠标返回内部后立即更新。
一个简单的实现可能如下:
var primaryMouseButtonDown = false;
function setPrimaryButtonState(e) {
var flags = e.buttons !== undefined ? e.buttons : e.which;
primaryMouseButtonDown = (flags & 1) === 1;
}
document.addEventListener("mousedown", setPrimaryButtonState);
document.addEventListener("mousemove", setPrimaryButtonState);
document.addEventListener("mouseup", setPrimaryButtonState);
该代码跟踪主要鼠标按钮(通常是左键)的状态,忽略其他鼠标按钮的状态。
如果需要更复杂的情况(不同的按钮/多个按钮/控制键),请查看MouseEvent
文档。
MouseEvent.buttons
的文档,似乎数字7
表示它认为主、次和辅助按钮都被同时按下了。
不确定为什么会这样 - 你使用了高级鼠标吗?如果是这样,也许值得尝试使用基本鼠标。
如果你只是需要让它工作,可以使用位运算检查,确保只有左键被按下并忽略其他任何键。例如, MouseEvent.buttons & 1 === 1
。 - Jono Job我认为最好的方法是保留鼠标按钮状态的记录,具体实现如下:
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 事件对象。
我知道这是一篇旧帖子,但我觉得使用鼠标上下键跟踪鼠标按钮有些笨拙,所以我找到了另一种可能会吸引一些人的替代方法。
<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选择器在处理鼠标点击时要比mousedown/up更好,您只需要在onmousemove事件中读取该状态即可。为了实现这一点,我需要作弊并依赖于默认光标为“auto”的事实,并将其更改为“default”,这是默认情况下自动选择的内容。
您可以使用由getComputedStyle返回的对象中的任何东西作为标志,而不会影响您页面的外观,例如border-color。
我本来希望在:active部分设置自己定义的用户样式,但我无法使其工作。如果可能的话,最好。
如果您正在处理一个具有现有鼠标事件处理程序的复杂页面,我建议在捕获阶段处理事件(而不是冒泡)。要做到这一点,只需将addEventListener
的第3个参数设置为true
。
此外,您可能需要检查event.which
以确保您正在处理实际的用户交互而不是鼠标事件,例如:elem.dispatchEvent(new Event('mousedown'))
。
var isMouseDown = false;
document.addEventListener('mousedown', function(event) {
if ( event.which ) isMouseDown = true;
}, true);
document.addEventListener('mouseup', function(event) {
if ( event.which ) isMouseDown = false;
}, true);
将处理程序添加到文档(或窗口)而不是文档主体很重要,因为它确保记录窗口外的鼠标松开事件。
如果其他人遇到这个问题,可以使用.matches
和:active
选择器:
function mouseDown() {
return document.body.matches(":active");
}
document.body.matches(":active")
是否为真,并且只有在这种情况下将其用作拖动结束的额外测试。 - kshetline使用MouseEvent API来检测是否按下了任何鼠标按钮:
// Mouse buttons
document.addEventListener('mousedown', e => console.log(e.buttons))
// Keyboard keys
document.addEventListener('keydown', e => console.log(e.key))
返回值:
A number representing one or more buttons. For more than one button pressed simultaneously, the values are combined (e.g., 3 is primary + secondary).
0 : No button or un-initialized 1 : Primary button (usually the left button) 2 : Secondary button (usually the right button) 4 : Auxilary button (usually the mouse wheel button or middle button) 8 : 4th button (typically the "Browser Back" button) 16 : 5th button (typically the "Browser Forward" button)
function doStuff() {
// does something when mouse is down in body for longer than 2 seconds
}
var mousedownTimeout;
document.body.onmousedown = function() {
mousedownTimeout = window.setTimeout(doStuff, 2000);
}
document.body.onmouseup = function() {
window.clearTimeout(mousedownTimeout);
}
您需要处理MouseDown和MouseUp事件,并设置一些标志或其他内容来跟踪它“稍后在路上”... :(