onselectionchangeを用いた、iOS Safariでのカーソル移動検知
完全版は物理キーボードに繋いだiPadでカーソル移動するを参照
2019/5/7
iPad Pro (iOS) にキーボードを繋いで動作確認する
これまでの調査 
Scrapboxのsearch box内では矢印キーでカーソル移動できるか?
ここは普通のinputタグなのでできる
カーソル移動を検知するだけの隠しinputを置くというアイデアのタネ
そのとき、どんなイベントが飛んでいるか?
keydown, keyup が取れるか?
alert(e.keyCode)
を仕込んで調べる← | ↑ | ↓ | → | |
keyDown | x | x | x | x |
keyUp | x | x | x | x |
keyPress | x | x | x | x |
ふつうの文字に関しては、すべてo
textareaにするとどうか
← | ↑ | ↓ | → | |
keyDown | x | x | x | x |
keyUp | x | x | x | x |
keyPress | x | x | x | x |
やはりkeyDown, keyUp, keyXXXX は諦めるしかない
本題
GWの帰りの新幹線で思い出したonselectionchangeを試してみる
onselectionchange
document.onselectionchange = e => { console.log(e); }
← | ↑ | ↓ | → | |
onselectionchange | o | o | o | o |
document.activeEvent === document.querySelector(".input-dummy")
のときだけ反応すればいい さらに ArrowLeft (37), ArrowRight (39) だけ反応すればいい
攻略できた
フォーカスの状態遷移
.text-input (既存)
文字入力を受け付けるための隠しtextarea
.input-dummy (仮称、新設)
onselectionchangeを発火させるための隠しinput
これを実装できればiOSでもカーソルを自在に操れる
.input-dummyに対する小細工は相変わらず必要
top位置調整
valueを十分に長くする
長押しさせない
OS標準の範囲選択UIが発動してしまうため
input-dummyの隠し方
css
.input-dummy {
border: none;
background-color: transparent;
color: transparent;
caret-color: transparent;
}
visibility: hidden や readOnly は使えない
課題
focusの移し合いは現実的でない
できたが、かなり不安定 




上に書いたよりずっとシンプルにできたので、説明も書き直す