[英]RxJS count how long hovered over button
每当有人将鼠标悬停在按钮上时,我都能够登录到控制台,但是我怎么可能发生这几秒钟并汇总总数呢?
var result = document.getElementById('result');
var source = Rx.Observable.fromEvent(result, 'mouseover');
var subscription = source.subscribe(
function (x) {
console.log('Hovered!');
}
);
如果我正确地理解了您的要求,则需要检查鼠标何时也离开了元素,然后使用和运算符(如scan
对总数求和。 一个相对简单的方法是获取mouseover
的时间戳,然后对mouseout
事件进行采样:
var result = document.getElementById('result');
var mouseOver = Rx.Observable.fromEvent(result, 'mouseover');
var mouseOut = Rx.Observable.fromEvent(result, 'mouseout');
mouseOver
//Get the time of the mouseover event
.timestamp()
//Don't emit until the mouseOut triggers
.sample(mouseOut)
//Extract only the timestamp value
.pluck('timestamp')
//Get a new timestamp (remember this is *after* mouse out)
.timestamp()
//Compute the timeinterval
.map(x => x.timestamp - x.value)
//Add the new time interval to the running total
.scan((total, diff) => total += diff, 0)
.subscribe(x => console.log(x));
这是我想出的另一种解决方案,不是最佳方案,但值得分享。
var counter = 0;
var source = Rx.Observable.interval(100)
.map(() => '.');
var display = document.querySelector("#display");
var toggle = document.querySelector("#toggle");
var hover = false;
var mouseOver = Rx.Observable.fromEvent(toggle, "mouseenter")
.map(e => {hover=true;});
var mouseOut = Rx.Observable.fromEvent(toggle, "mouseleave")
.map(e => {hover=false;});
mouseOver //.filter(x => true)
.flatMapLatest(() => source.takeUntil(mouseOut))
.subscribe(x => {counter += 1; display.innerText = counter});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.