简体   繁体   English

如果使用Bacon.js跟踪拖动事件,我将如何取消点击事件?

[英]How would I cancel a click event if it was following a drag event using Bacon.js?

So I have some event streams: 所以我有一些事件流:

let mouseUps = $(window)
  .asEventStream('mouseup');

let mouseDowns = $(window)
  .asEventStream('mousedown');

let mouseMoves = $(window)
  .asEventStream('mousemoves');

let drags = mouseDowns
  .flatMapLatest(() => mouseMoves.takeUntil(mouseUps));

let clicks = $(window)
  .asEventStream('click')
  .onValue(() => doThing());

I'd like to ignore clicks that get triggered right after a drag ends. 我想忽略拖动结束后立即触发的点击次数。 I feel like there has go to be a fairly simple way to do this, but I'm still struggling with some of the core concepts. 我觉得有一个相当简单的方法可以做到这一点,但我仍然在努力解决一些核心概念。

The solution is to create a property using stream.awaiting() that can be used to filter out the click after dragging. 解决方案是使用stream.awaiting()创建一个属性,该属性可用于在拖动后过滤掉单击。

var btn = $('#btn');
var mouseUps = btn.asEventStream('mouseup');
var mouseDowns = btn.asEventStream('mousedown');
var mouseMoves = btn.asEventStream('mousemove');
var drags = mouseDowns.flatMapLatest(function () {
    return mouseMoves.takeUntil(mouseUps);
});

var clicks = btn.asEventStream('click');
var isDraggingStarted = drags.awaiting(mouseDowns);

clicks.filter(isDraggingStarted.not()).onValue(doThing);

An example can be found here: http://jsfiddle.net/a128jhxb/1/ 可以在这里找到一个例子: http//jsfiddle.net/a128jhxb/1/

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

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