繁体   English   中英

我将如何取消 javascript 中的特定事件?

[英]How would I cancel a specific event in javascript?

我在on方法中添加了 2 个不同的事件,每个事件都称为touchstartmousedown ,如下所示:

this.$el.on('touchstart mousedown', (e) => { this.start(e); })

我的主要目标是取消了mousedown唯一的事件属于on在所谓的最终方法end的功能。

如果我运行touchstart事件,2 个不同的事件总是一起触发。 看这张图:

在此处输入图片说明

此问题会导致 Firefox 出现意外事件阻止。 而且代码运行两次,这是不必要的。 我想在clicktouch元素时重定向网站,在dragswipe时阻止。

我在谷歌上搜索了如何防止特定事件,但没有找到任何信息,所以我自己尝试了几种方法。 然而,所有的案例都没有奏效。

  1. 添加return false; 线

    • 可悲的是, return false会在end函数结束后停止所有剩余的事件。 我的目标是仅取消mousedown ,而不是整个events 因此,我不能只是将行放入函数中。
  2. off方法中添加mousedown事件

    • 这也行不通。 属于off方法的eventsoff仍然保留。 因此,如果我在滑动元素后尝试拖动,则不会发生任何事情,因为mousedown事件现在已关闭。
  3. 添加preventDefault()stopPropagation()

    • 那些不能用作案例1的相同原因。
  4. 使用RegExp为 Firefox 分离并创建一个新函数

    • 问题是触发了不需要的事件,而不是浏览器。

有没有办法取消此代码中的特定event

 class Evt { constructor($el) { this.$el = $el; } start(e) { console.log('start Function'); this.$el.off('click'); this.$el.on({ ['touchmove mousemove']: (e) => this.eventmove(e), ['touchend mouseup']: (e) => this.end(e) }); } eventmove(e) { e.preventDefault(); console.log('move function'); this.$el.on('click', (e) => {e.preventDefault();}); return false; } end(e) { console.log('end function'); this.$el.on('click'); this.$el.off('touchmove touchend mousemove mouseup'); } apply() { this.$el.on('touchstart mousedown', (e) => { this.start(e); }) } } var thatEvt = new Evt($('#link')); thatEvt.apply();
 a { width: 100%; height: 200px; border-radius: 10px; background-color: brown; font-family: Helvetica; }
 <a id="link" href="https://google.co.uk"> Click/Touch and Drag/Swipe </a> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

据我所知,您的目的是在单击内移动鼠标时不重定向链接。

首先,我假设您不希望链接可拖动,因此添加draggable="false"标签。 这将防止可能影响您发送的内容之外的代码的事件(例如重定向/删除链接)。

<a id="link" href="https://google.co.uk" draggable="false">
  Click/Touch and Drag/Swipe
</a>

如果这不能解决您的问题,我将下面的代码放在一起,它可能更复杂,但应该更健壮一些。

class Evt {
  constructor($el) {
    this.$el = $el;
    this.active = false;
    this.preventRedirect = false;
  }
  start(e) {
    console.log('start Function');
    this.active = true;
    this.preventRedirect = false;
  }
  eventmove(e) {
    if (this.active) {
      console.log('move function');
      this.preventRedirect = true;
    }
  }
  end(e) {
    if (this.active) {
      console.log('end function');
      this.active = false;
    }
  }
  apply() {
    this.$el.on({
      ['touchstart mousedown']: (e) => this.start(e),
      ['click']: (e) => { //preventing onclick only if preventRedirect is set
        if (this.preventRedirect) {
          e.preventDefault();
          return false;
        }
      }
    });
    $("html").on({ //so that the mouse can move outside the element and still work.
      ['touchmove mousemove']: (e) => this.eventmove(e),
      ['touchend mouseup']: (e) => this.end(e)
    });
  }
}
var thatEvt = new Evt($('#link'));
thatEvt.apply();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM