javascript - 在 JavaScript 中检测点击与触摸

标签 javascript click touch

<分区>

我知道您可以根据以下答案检测浏览器是否在带有触摸屏的设备上运行:https://stackoverflow.com/a/4819886/589921

但是,我知道有些设备既有触摸屏又有鼠标。我可以检测出这些类型的触摸之间的区别吗?本质上,我想区分 3 个不同的事件:onClick(在点击或触摸时触发)、onTouch(仅在触摸时触发)、onMouseClick(仅在点击时触发)。

最佳答案

您可以使用 pointerType property on PointerEvent检测输入类型(“mouse”“touch”“pen”):

element.addEventListener('pointerdown', (event) => {
  if (event.pointerType === "mouse") {}
  if (event.pointerType === "touch") {}
  if (event.pointerType === "pen") {}
});

如果您想为每种类型的点击指定特定的事件,您可以 create custom events :

const mouse = new Event("mouseclick");
const touch = new Event("touch");
document.addEventListener("pointerdown", ({ pointerType, target }) => {
  if (pointerType === "mouse") target.dispatchEvent(mouse);
  if (pointerType === "touch") target.dispatchEvent(touch);
});

const someElement = document.querySelector(".box");
someElement.addEventListener("mouseclick", () => {
  console.log("Clicked with mouse");
});
someElement.addEventListener("touch", () => {
  console.log("Touched with mobile device");
});
someElement.addEventListener("click", () => {
  console.log("Clicked by some device (we don't know)");
});
.box {
  position: absolute;
  inset: 2em;
  background: darkred;
  padding: 1em;
}
<div class="box">A box with custom events</div>

(注意:未在触摸屏设备上测试)

请注意,如果您使用的是 React 或其他框架,则可能有不同的方法来创建自定义事件。

例如,在 React 中,您可以使用自定义 Hook 实现这些事件:

const useClickEvents = ({ onMouseClick, onTouch, onClick }) => ({
  onClick,
  onPointerDown({ pointerType }) {
    if (pointerType === "mouse") onMouseClick(); 
    if (pointerType === "touch") onTouch(); 
  },
});
function SomeComponent({ onClick, onMouseClick, onTouch, children }) {
  const clickEventProps = useClickEvents({ onClick, onMouseClick, onTouch });
  return (
    <div className="something" {...clickEventProps}>
      <p>Custom events on this thing</p>
      {children}
    </div>
  );
}

关于javascript - 在 JavaScript 中检测点击与触摸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70827887/

相关文章:

Android ListView Header 禁用点击

javascript - 如何让hammer.js在不使用jquery的情况下处理svg文件?

swift - 检查是否同时触及不同的 View

javascript onclick 获取更多信息

javascript - 如何正确调试和确定 IE 中 js 错误的 javascript/ajax 根本原因

jquery - 可拖动元素运行单击功能

c - C 中的数独在框架中单击

javascript - 在多个实例中更改文本 onclick

javascript - JavaScript 中的非破坏性 split() ?

c# - ScrollViewer 中的 ScrollViewer