javascript - 如何检测点击后鼠标按钮是否被按住一定时间

标签 javascript canvas html5-canvas

您好,我是 javascript 的新手。我希望能够在用户点击 Canvas 中的点(短按)时触发一个事件,如果按住该点击 1500 毫秒,我应该有另一个功能。我应该在 mouseup 完成之前识别出长按。

例如:

el.addEventListener("mousedown", doMouseDown, false); el.addEventListener("mouseup", update, false);

function doMouseDown()
{
if (short press)
functionality of shortpress

if (longpress) 
functionality of long press
}

function update()
//do some update of coordinates

最佳答案

要使其正常工作,需要考虑几个关键点:

  • 只有当鼠标悬停在元素上时,元素才能为自己检测鼠标事件。为使 mouseup 正常工作,必须对其进行“全局”监控(在窗口或文档上),并跟踪按钮状态。
  • 长按类型的状态必须在所有阶段进行跟踪和尊重。例如:如果长按,请确保 mouseup 最终遵循新状态并且本身被覆盖(否则您将在长按之上获得 mouseup)。如果您确实想要在任何情况下使用 mouseup,当然请忽略这一点。
  • 多个元素的功能(见下面的评论)

您可以通过在处理程序代码中引用 this 来使处理程序通用。这样你就可以将它附加到任何元素。 mouseup 的全局处理程序仅添加一次,并将使用跟踪目标来区分哪个元素导致了 mousedown。计时器调用的代码将绑定(bind)元素上下文 (bind()),因此我们也可以使用通用的长按处理程序来寻址源元素(请参见下面的演示)。

例子

var d = document.querySelectorAll("div"),
    isDown = false,
    isLong = false,
    target,                                         // which element was clicked
    longTID;                                        // so we can cancel timer

// add listener for elements
d[0].addEventListener("mousedown", handleMouseDown);
d[1].addEventListener("mousedown", handleMouseDown);
d[2].addEventListener("mousedown", handleMouseDown);

// mouseup need to be monitored on a "global" element or we might miss it if
// we move outside the original element.
window.addEventListener("mouseup", handleMouseUp);

function handleMouseDown() {
  this.innerHTML = "Mouse down...";
  isDown = true;                                    // button status (any button here)
  isLong = false;                                   // longpress status reset
  target = this;                                    // store this as target element
  clearTimeout(longTID);                            // clear any running timers
  longTID = setTimeout(longPress.bind(this), 1500); // create a new timer for this click
};

function handleMouseUp(e) {
  if (isDown && isLong) {                           // if a long press, cancel
    isDown = false;                                 // clear in any case
    e.preventDefault();                             // and ignore this event
    return
  }
  
  if (isDown) {                                     // if we came from down status:
      clearTimeout(longTID);                        // clear timer to avoid false longpress
      isDown = false;
      target.innerHTML = "Normal up";               // for clicked element
      target = null;
  }
};

function longPress() {
  isLong = true;
  this.innerHTML = "Long press";
  // throw custom event or call code for long press
}
div {background:#ffe;border:2px solid #000; width:200px;height:180px;
     font:bold 16px sans-serif;display:inline-block}
<div>Click and hold me...</div>
<div>Click and hold me...</div>
<div>Click and hold me...</div>

关于javascript - 如何检测点击后鼠标按钮是否被按住一定时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30247497/

相关文章:

javascript - 用 Canvas 元素替换带有背景图像的div

javascript - 如何将 HTML 标记的 Jquery 选择器获取到字符串值?

JavaScript Array.length 返回 0

javascript - 带有 setInterval 的当前类(this)的toggleClass

javascript - 我对 shuffle 数组函数的设置和调用哪里出了问题?

html - 在选择 html5 canvas 框架时需要帮助

javascript - 在 Canvas 元素中对模拟渐变进行动画处理时的随机图案

javascript - 使用外部 Javascript 在 HTML 页面上显示一个框?

javascript - 使用 fillText 在 Canvas 上书写空白

javascript - 为什么我不能获得超过 2 个变量来处理 HTML5 Canvas 和 JavaScript?