有没有一种方法可以检测JavaScript中的鼠标按钮当前是否处于按下状态?
我知道“ mousedown”事件,但这不是我所需要的。按下鼠标按钮后的一段时间,我希望能够检测它是否仍被按下。
这可能吗?
有没有一种方法可以检测JavaScript中的鼠标按钮当前是否处于按下状态?
我知道“ mousedown”事件,但这不是我所需要的。按下鼠标按钮后的一段时间,我希望能够检测它是否仍被按下。
这可能吗?
Answers:
关于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使用一个名为…“ event”的全局事件对象。
顺便说一句,IE具有一种适用于您的情况的功能:当其他浏览器仅针对鼠标事件(onclick,onmousedown和onmouseup)发送“ button”时,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样式的代码。最好将事件处理程序直接附加到文档。
event.buttons
正在使用的任何事件触发器,而无需外部保存的变量。我问了一个全新的问题(因为我的mouseup事件并不总是触发,因此该解决方案对我而言不起作用),并可能在5分钟内获得答案。
这是一个古老的问题,这里的答案似乎主要提倡使用mousedown
并mouseup
跟踪按钮是否被按下。但正如其他人指出的那样,mouseup
只有在浏览器中执行时才会触发,这可能会导致无法跟踪按钮状态。
但是,MouseEvent(现在)指示当前按下了哪些按钮:
MouseEvent.buttons
MouseEvent.which
(buttons
将不确定的Safari浏览器)注: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取消其游戏,这应该会变得更加容易。
e.buttons
则将为1+2=3
,因此e.buttons === 1
将为false)。如果要检查主按钮是否按下,但不关心其他按钮状态,请执行以下操作:(e.buttons & 1) === 1
我认为最好的方法是保留自己的鼠标按钮状态记录,如下所示:
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.
}
我知道这是一篇过时的文章,但是我认为使用鼠标上/下键来跟踪鼠标按钮感觉有些笨拙,因此我找到了一种可能吸引某些人的替代方法。
<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返回的对象中使用可以用作标志的任何内容,而不会破坏页面的外观,例如border-color。
我本想在:active部分中设置自己的用户定义样式,但无法使其正常工作。如果可能的话会更好。
以下代码段将在document.body中发生mouseDown事件2秒后尝试执行“ doStuff”功能。如果用户抬起按钮,将发生mouseUp事件并取消延迟的执行。
我建议使用某种方法来跨浏览器事件附加-显式设置mousedown和mouseup属性是为了简化示例。
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);
}
我不确定为什么以前的答案都不对我有用,但是我在尤里卡的时候提出了这个解决方案。它不仅有效,而且最优雅:
添加到正文标签:
onmouseup="down=0;" onmousedown="down=1;"
然后测试并执行myfunction()
是否down
等于1
:
onmousemove="if (down==1) myfunction();"
您可以结合使用@Pax和我的答案来获得鼠标按下的持续时间:
var mousedownTimeout,
mousedown = 0;
document.body.onmousedown = function() {
mousedown = 0;
window.clearInterval(mousedownTimeout);
mousedownTimeout = window.setInterval(function() { mousedown += 200 }, 200);
}
document.body.onmouseup = function() {
mousedown = 0;
window.clearInterval(mousedownTimeout);
}
然后再:
if (mousedown >= 2000) {
// do something if the mousebutton has been down for at least 2 seconds
}
如果您使用现有的鼠标事件处理程序在一个复杂的页面中工作,建议您在捕获时处理事件(而不是气泡)。为此,只需将的第3个参数设置addEventListener
为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);
将处理程序添加到文档(或窗口)而不是document.body是很重要的b / c,它可以确保仍然记录窗口外的 mouseup事件。
使用MouseEvent API检查按下的按钮(如果有):
document.addEventListener('mousedown', (e) => console.log(e.buttons))
返回:
一个代表一个或多个按钮的数字。如果同时按下多个按钮,则将这些值组合在一起(例如,3个为主要+次要)。
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)
在jQuery示例下,当鼠标悬停在$('。element')上方时,颜色会根据所按下的鼠标按钮而变化。
var clicableArea = {
init: function () {
var self = this;
('.element').mouseover(function (e) {
self.handlemouseClick(e, $(this));
}).mousedown(function (e) {
self.handlemouseClick(e, $(this));
});
},
handlemouseClick: function (e, element) {
if (e.buttons === 1) {//left button
element.css('background', '#f00');
}
if (e.buttons === 2) { //right buttom
element.css('background', 'none');
}
}
};
$(document).ready(function () {
clicableArea.init();
});
var mousedown = 0;
$(function(){
document.onmousedown = function(e){
mousedown = mousedown | getWindowStyleButton(e);
e = e || window.event;
console.log("Button: " + e.button + " Which: " + e.which + " MouseDown: " + mousedown);
}
document.onmouseup = function(e){
mousedown = mousedown ^ getWindowStyleButton(e);
e = e || window.event;
console.log("Button: " + e.button + " Which: " + e.which + " MouseDown: " + mousedown);
}
document.oncontextmenu = function(e){
// to suppress oncontextmenu because it blocks
// a mouseup when two buttons are pressed and
// the right-mouse button is released before
// the other button.
return false;
}
});
function getWindowStyleButton(e){
var button = 0;
if (e) {
if (e.button === 0) button = 1;
else if (e.button === 1) button = 4;
else if (e.button === 2) button = 2;
}else if (window.event){
button = window.event.button;
}
return button;
}
这个跨浏览器的版本对我来说很好用。