【问题标题】:Prevent pointerdown event from triggering on mobile when user tapholds and scrolls当用户点击和滚动时,防止在移动设备上触发 pointerdown 事件
【发布时间】:2019-05-31 15:04:11
【问题描述】:

您好,我已经实现了一个运行良好的长按 javascript 事件处理程序。然而,在移动设备上,用户点击...按住...以向上或向下滚动。移动设备上的这种滚动交互无意中触发了我的“指针向下”事件。我尝试在事件处理程序链中插入一个pointermove 事件,但这似乎触发了任意次数,具体取决于用户在指针向下时移动指针的时间,因此我无法设置一个布尔值可靠,不会来回翻转。

let pressTimer;
this.myElements.on('pointerup', (e) => {
  clearTimeout(pressTimer);
}).on('pointerdown', (e) => {
  let myEl = $(e.currentTarget);
  let checkbox= myEl.find('.checkbox');
  pressTimer = window.setTimeout(() => {
    checkbox.click();
  }, 750)
});

【问题讨论】:

    标签: javascript jquery mobile touch mouseevent


    【解决方案1】:

    您可以添加一个全局布尔变量来保存指针的当前状态(可能是 isPointerDown)并采取相应措施。例如如果它是真的不要对pointerdown做出反应,如果有一个pointerup事件将这个变量重置为false。

    let pressTimer;
    var isPointerDown = false;
    this.myElements.on('pointerup', (e) => {
      clearTimeout(pressTimer);
      isPointerDown = false;
    }).on('pointerdown', (e) => {
      if (!isPointerDown) {
        let myEl = $(e.currentTarget);
        let checkbox = myEl.find('.checkbox');
        pressTimer = window.setTimeout(() => {
          isPointerDown = true;
          checkbox.click();
        }, 750)
      }
    });
    

    【讨论】:

    • 但是当用户向上或向下滚动时,isPointerDown 是否仍然正确?这就是我想要阻止的。对不起,也许我不清楚
    • 在 pointerdown 处理程序中,我们正在检查 isPointerDown 的当前值 - 如果它是真的,它将不会在 750 毫秒后调用 setTimout 和复选框上的 click()。这不是您要防止的吗?
    • 我试过了,没用。我的猜测是因为滚动也会激活向下指针
    • 我通过比较 window.scrollY 在开始时和 pointerdown 的 setTimeout 内的值解决了滚动时的点击问题
    • 不错!很高兴您能找到解决方案。
    猜你喜欢
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多