Scrapboxで任意の文字にcursorを移動させる
発見したのでメモするtakker.icon
Thanks /yuta0801/yuta0801.icon !
コード及び解説
clickだとうまく行かない
mouse buttonが押されて離された後に発行されるのが原因?
MouseEvent()のclientX, clientXに移動先文字の座標を入れる
入れないと常に.c-0に飛ぶようになる
誤動作を防ぐため、文字の高さの中間位を押すようにclientYを調節する
調節しないと一つ上の行を選択してしまうことがある
必ずmouseupも発行する
これを発行しなくても一見うまく行くように見えるが、ほんの少しmouseを動かすと選択範囲がいきなり現れる現象が起きる
おそらく「mouse buttonを離していない=文字列を選択中である」と解釈されるからではないか?
1. 行idのn文字目にcursorを移動させる
リンクやcode block, 動画や画像の埋め込みがない行でのみ正常に動く
↑があると、文字をクリックできない
DOMを取得
code:js
const char = document.getElementById(id).getElementsByClassName(c-${n})0; 取得した文字の左上の座標を取得する
code:js
const {left, top, height} = headChar.getBoundingClientRect();
code:js
const mouseOptions = {
button: 0,
clientX: left,
clientY: top + height / 2,
bubbles: true,
cancelable: true,
view: window
};
code:js
char.dispatchEvent(new MouseEvent("mousedown", mouseOptions));
mouse buttonを離すeventを発行する
code:js
char.dispatchEvent(new MouseEvent("mouseup", mouseOptions));
2. 任意の行の末尾にcursorを移動する
リンクやcode block、画像がある行でもつかえる
動画があっても使えるはず
行idのspan.textを取得する
code:js
const line = document.getElementById(id).getElementsByClassName('text')0; span.textの座標を取得する
code:js
const {right, top, height} = line.getBoundingClientRect();
span.textの右端をclickするよう設定する
code:js
const mouseOptions = {
button: 0,
clientX: right,
clientY: top + height/2,
bubbles: true,
cancelable: true,
shiftKey: shiftKey,
ctrlKey: ctrlKey,
altKey: altKey,
view: window
};
あとは1.と同じ
code:js
line.dispatchEvent(new MouseEvent("mousedown", mouseOptions));
line.dispatchEvent(new MouseEvent("mouseup", mouseOptions));