モバイル版Scrapboxでキャレットを外してみたい
試してみるtakker.icon
code:js
const textInput = document.getElementById("text-input");
textInput.addEventListener("keydown", (e) => {
if (e.key !== "[" || !e.ctrlKey) return;
e.preventDefault();
e.stopPropagation();
textInput.blur();
});
あ!できた
なんだ。めちゃくちゃ簡単じゃないか
明日自分のUserScriptに入れておこうっと
作ろうと思って検証していたら既に作られていた件についてkuuote.icon
使わせてもらいます
これはEscキーを押すとって感じか
物理キーボード向けかー、自分でも考えないと
これだとだめだtakker.icon
文字入力はできなくなるけど、caretは依然swipeで動かせてしまう
caretそのものはいったん別のページに飛ばないと消えない
スワイプでカーソル動く部分はswipeCursorで検索すると出てくるkuuote.icon
別にこれを読みたかったわけではないのだけど、迷走しているな
あ、カーソルの動かし方知りたかったんだ
37633行あたりか
カーソルオブジェクトのhide()呼べばいいのは分かったけどアクセス方法がわからん
アクセスした所でだめということを理解した
code:javascript
hide() {
v.When.touch_device && (this.focusTextarea = !1),
this.visible = !1,
this.emitChange();
}
該当箇所がこうなっているので中の人にどうにかしてもらうしかなさそう
いやこれは関係ないのか、モバイル版だと到達していない気が
MobileTextInputのonBlurがこうなってて
code:javascript
onBlur(t) {
if (t.preventDefault(),
t.stopPropagation(),
ce("onBlur"),
this.keepFocus)
return ce("onBlur: force focus back"),
void this.textarea.focus();
this.state.focusTextarea && !(0,
ae.isModalOpen)() && (Y.default.Cursor.hidePopupMenu(),
Y.default.Cursor.blur(),
this.setState({
focusTextarea: !1
}))
}
keepFocusで引っかかってる
カーソルオブジェクトにさえアクセスできればclear()叩くかvisible以下を再現することで優勝できる
延々と調べてるけどなんもわからん、Scrapboxの中核らしきオブジェクトは見付けたけど当然ながら外には露出してないし
お疲れ様ですtakker.icon
う~んだめかあ
__webpack_require__(22852)したら手に入るんですが、当然これはindex.jsが更新されたら変わるだろうからだめだろうし…kuuote.icon
嘘だ、これデバッガで止めてたから見えてただけだ
これComponentじゃない気がするkuuote.icon
/vim-jp-emojis/munen.icontakker.icon
MobileTextInputはComponentなのでこれで優勝できる気がしてきたkuuote.icon
よく見たらこちらで呼ばれているのはhideじゃなくてblurだ、つらい
ん、行けた?
カーソルオブジェクト手に入れたぞkuuote.icon*10
/vim-jp-emojis/オッ.iconyosider.icon
/vim-jp-emojis/+1smile.iconkuuote.icon
MobileTextInputがCursorオブジェクトをsubscribeしていたのでそこから抜き出した
code:hide.js
const textarea = document.getElementById('text-input');
const reactKey = Object.keys(textarea)
.find((key) => key.startsWith("__reactFiber"));
const input = textareareactKey.return.return.stateNode; const cursor = input._stores.find((obj) => obj.hide);
cursor.hide();
これでキャレット消せるkuuote.icon
後はこれをUserScriptに仕立て上げればいい
どんなUIにしたらいいのかわからんので誰か頼んだ
気が向いたらやるかも
しっかし明日使えなくなるかもしれないハックに全力を注ぎ込みすぎた
余談だけどこの邪悪な方法を使えばカーソルや選択範囲を動かし放題
選択範囲も取れる
/icons2/すばら.icon/emoji/tada.iconyosider.icon*2takker.icon*2
ページの領域外をタップしたら発動してほしいyosider.icon
スマホだと狭いかも?
今そんな感じで仕込んでみた所kuuote.icon
code:script.js
function hideCaret() {
const textarea = document.getElementById("text-input");
const reactKey = Object.keys(textarea)
.find((key) => key.startsWith("__reactFiber"));
const input = textareareactKey.return.return.stateNode; const cursor = input._stores.find((obj) => obj.hide);
cursor.hide();
}
document.getElementById("app-container").addEventListener("touchstart", (e) => {
// ページの外をタッチするとキャレットを外す
if (!e.target.closest(".page")) {
hideCaret();
}
});
これを自己責任でUserScriptに書き込んでみてくださいkuuote.icon
変なことはしてないはずだけどいつ動かなくなるか分からない
一度乗り切ってはいるけど
どんどんやろうkuuote.icon
把握してメンテできるのならいいのではと思ってる
takker.iconさんがもしインターン行くならこのへん話してみてもよさそう
(UserScriptもっと書きやすくなってくれーという気持ち(他力本願))
VivaldiのDevToolsとPixel 4aのChromeで動作確認してます
おお~消えた!takker.iconyosider.icon
そういうことがtakker.icon