rxjs6 でクリックとドラッグを識別する
rxjs6 でクリックとドラッグを識別する:
サンプルコード があるのでそれでだいたい分かると思う。
同じ DOM に対して クリック処理とドラッグ処理をさせたいときってありますよね?
rxjs6 ならそこそこ楽に書けますよ。
まずこちらの html と css を用意して
具体的には ドラッグ開始 と クリック を識別します。それぞれ以下と定義します。
1. ドラッグ開始 … マウスが押されてから一定時間押しっぱなしであること
2. クリック … マウスが押されてから一定時間にマウスが離されること
上記処理の 早く発火した方 を拾うことができればいいわけです。
まず source のストリームを作ります。
これらのストリームを
最後に
続いて subscribe の実装ですが、
あとは煮るなり焼くなりしてみてください。
楽ですね。
TL;DR
サンプルコード があるのでそれでだいたい分かると思う。
はじめに
同じ DOM に対して クリック処理とドラッグ処理をさせたいときってありますよね?rxjs6 ならそこそこ楽に書けますよ。
実装
まずこちらの html と css を用意して<div id="sample" />
#sample { position: absolute; top: 100px; left: 100px; width: 100px; height: 100px; background-color: #00a1e9; }
#sample
に対するクリックとドラッグの識別をやってみます。具体的には ドラッグ開始 と クリック を識別します。それぞれ以下と定義します。
1. ドラッグ開始 … マウスが押されてから一定時間押しっぱなしであること
2. クリック … マウスが押されてから一定時間にマウスが離されること
上記処理の 早く発火した方 を拾うことができればいいわけです。
まず source のストリームを作ります。
1.
2.
をそれぞれ of(e).pipe(delay(200))
、fromEvent(el, 'mouseup')
と実装しています。これらのストリームを
merge
して first
で早く発火したほうを次へ流します。最後に
share
で以降のドラッグとクリックの subscribe で同一のストリームを受け取るようにします。const el = document.getElementById('sample') const source = fromEvent(el, 'mousedown').pipe( switchMap((e) =>{ // 200ms 遅延した mousedown イベント または // mouseup イベントの // どちらか早く発火した方を次へ流す return merge( of(e).pipe(delay(200)), fromEvent(el, 'mouseup') ).pipe(first()) }), share() )
e.type === 'mouseup'
でクリックかドラッグ開始か判別しています。あとは煮るなり焼くなりしてみてください。
// e.type でクリックかドラッグか識別する const click = source.pipe( filter((e) => e.type === 'mouseup') ).subscribe((e) => { alert('click!') }) const drag = source.pipe( filter((e) => e.type !== 'mouseup') ).subscribe((e) => { alert('drag!') })
コメント
コメントを投稿