✅️scrapbox-userscript-stdにaddTextInputEventListenerを実装する
scrapbox-userscript-stdにaddTextInputEventListenerを実装する
背景
layout:changedで#text-inputが消えるようになった
結果、一旦トップページに戻ってから別のページに移る操作をしたさい、#text-inputに登録したキーバインドなどが効かなくなる問題が発生した
対策として、text-inputが消えて復活するたびにevent listenersを再登録するプログラムを作ることにした
2024-05-24
17:51:57 merged
脱線してた
17:21:39 問題なさそうなので https://github.com/takker99/scrapbox-userscript-std/pull/172 をmergeする
17:14:25 E2Eテスト中
scrapboxのトップページに行ってから戻ってきても、listenerが消えていないことを確認した
Streamに飛ぶと、ページがリロードされてUserScriptがリセットされてしまうようだ
これは構わない
addEventListenerのonce optionの挙動も確認した
一度も実行されていなければ、ページ遷移でlistenerを維持する
一度実行されれば削除する
2024-05-20
16:49:14 とりあえずここまで
16:39:23 実装終了
重複チェックのテストも書いた
動作確認はまだしてない
16:15:19 AddEventListenerOptionsの重複チェックを実装した
by converting all frags into a bit series
from 日刊記録sheet 2024-04-19
15:15:43 addTextInputEventListenerを作っていた
eventname,listener,optionsの3つ組を重複せずに管理する必要があるなあ
onceだけ特別な処理をしなければならない
呼び出されたら自前のlistener DBから消す
重複チェックを自前実装するのが楽か
今日はここまでにしよう
removeEventListenerするlistenerの照合
https://developer.mozilla.org/ja/docs/Web/API/EventTarget/removeEventListener#取り外すイベントリスナーの照合
AddEventListenerOptions.captureだけチェックすればいいそうだ
ただし一貫性がない場合があるので、全部のoptionをcheckするのが無難とのこと
union distributionでEventListenerを型安全にする
結局使わなかった
なお、これを実装したとしてもScrapBindingsには適用できない
Mousetrapの内部でaddEventListenerなどを呼び出しているから
Mousetrap自体を作り直すしかない
作り直した→takker99/ScrapBindings
$ deno check --remote -r=https://scrapbox.io https://scrapbox.io/api/code/takker/scrapbox-userscript-stdにaddTextInputEventListenerを実装する/E2E-test.ts
/villagepump/カーソルが行頭になくてもTabでインデントするUserScriptで試す
code:E2E-test.ts
import { addTextInputEventListener, press, cursorLine, popupMenu } from "https://raw.githubusercontent.com/takker99/scrapbox-userscript-std/text-input/browser/dom/mod.ts";
addTextInputEventListener("keydown", (e) => {
if (e.key !== "Tab") return;
const cursor = cursorLine();
if((cursor?.getElementsByClassName?.("code-block")?.length ?? 0) !== 0) return;
if((cursor?.getElementsByClassName?.("table-block")?.length ?? 0) !== 0) return;
if(popupMenu()) return;
e.preventDefault();
e.stopPropagation();
press(e.shiftKey ? "ArrowLeft" : "ArrowRight", { ctrlKey: true });
}, { once: true });
#2024-06-10 13:20:29
#2024-05-20 15:26:31
#2024-04-19 15:19:32