LoginSignup
3
0

More than 3 years have passed since last update.

Selectionは取得するタイミングによっては反応に遅延が起きる

Posted at

Selectionは難しい

Selectionは難しく、同じ入力によるイベントでも種類によってデータが異なる。
また、setTimeoutやPromiseなどの非同期の仕組みを利用した場合にもデータが変わってしまう。
おのれSelection

環境

macOS 10.14.6
Google Chrome 77

検証1

コード

const hd = e => console.log(e.type, window.getSelection().focusOffset)
el.addEventListener("keydown", hd)
el.addEventListener("keyup", hd)

結果

イベントタイプ 入力したキー getSelection().focusOffset 期待値
keydown -> 0 1
keyup -> 1 1
keydown <- 1 0
keyup <- 0 0

考察

keyupのみ期待値通りになっていた。
なので、keydownからkeyupの間にgetSelectionの値に変化が出ていたであろう。
では、その間にデータが取れればどうなるだろうか。

検証2

コード

el.addEventListener("keydown", e => {
  setTimeout(() => console.log(e.type, window.getSelection().focusOffset), 0)
})
el.addEventListener("keyup", e => console.log(e.type, window.getSelection().focusOffset))

結果

イベントタイプ 入力したキー getSelection().focusOffset 期待値
keydown -> 1 1
keyup -> 1 1
keydown <- 0 0
keyup <- 0 0

見事にkeydownが期待値と一致した。

おわり

setTimeoutで実行を遅延することによって、期待値通りの結果を得られた。
エディタ開発の成功を祈って。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0