【发布时间】:2019-04-07 05:05:43
【问题描述】:
我在 on 方法中添加了 2 个不同的事件,每个事件分别称为 touchstart 和 mousedown,如下所示:
this.$el.on('touchstart mousedown', (e) => { this.start(e); })
我的主要目标是在调用 end 函数的末尾取消属于 on 方法的 mousedown 事件。
如果我运行 touchstart 事件 2 个不同的事件总是一起触发。看这张图:
此问题会导致 Firefox 出现意外事件阻塞。而且代码运行两次,这是不必要的。我想在我click 或touch 元素时重定向网站,当我drag 或swipe 时阻止。
我在谷歌上搜索了如何防止特定事件,但没有找到任何信息,所以我自己尝试了几种方法。然而,所有的案例都没有奏效。
-
添加
return false;行- 遗憾的是,
return false在end函数结束后停止所有剩余的事件。我的目标是只取消mousedown,而不是整个events。因此,我不能只将行放入函数中。
- 遗憾的是,
-
将
mousedown事件添加到off方法中- 这也不起作用。属于
off方法的events在关闭时仍然保留。因此,如果我在滑动元素后尝试拖动,则不会发生任何事情,因为mousedown事件现在已关闭。
- 这也不起作用。属于
-
添加
preventDefault()或stopPropagation()- 不能同案例1一样使用。
-
使用
RegExp为火狐分离并制作新功能- 问题是触发了不需要的事件,而不是浏览器。
有什么方法可以取消这段代码中特定的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>
【问题讨论】:
-
您是在问如何注销事件处理程序?
-
@Rafael 如果这能解决我的问题,那么可以。抱歉,我现在无法解释更多,因为我的词汇量较少:/
-
@Rafael 如果注销使用的是
off方法,那么我已经尝试过了,这是问题中的情况2。 -
我明白了...但是您要在每个
eventmove()上注册点击事件侦听器?你为什么这样做?看来您应该删除该行。 -
@Rafael 如果我删除该行,则
dragging该元素不会阻止重定向。它会打开一个新的浏览器。
标签: javascript click touch swipe drag