generated at
javascriptからIMEをcancelする
javascriptからIMEを切り替えるのは無理だが、 <textarea> のfocusを操作すれば間接的に制御できる
Scrapboxで確認済み
他のサイトでも使えるかもしれない

方法
正攻法はない
fail Escape キーを何らかの要素に渡してkey eventを発火させたらどうだろうか?
<text-input> に直接渡すのは無理だった
別の要素に渡すのはどうだろうか?
Scrapboxなら、 #editor に渡したらどうだ?
試してみるか。
EventTarget.dispatchEvent() keydown keyup eventを発火させる
21:46:05 だめだった
最初入力した は表示されたまま
その後何か入力すると、変換中の文字が何も表示されなくなる
変換候補だけが見える
変換中の文字を一旦全部消してからまた入力すると復活する

test1.js
export function execute() { const editor = document.getElementById('editor'); document.addEventListener('compositionupdate', e => { const buttons = document.getElementsByClassName('popup-menu') ?.[0]?.getElementsByClassName('button') if (!buttons) return; // そもそもpopup menuがなかったら何もしない if (e.data.length === 0) return; switch(e.data.split('').pop()) { case '「': //e.preventDefault(); //e.stopPropagation(); document.getElementsByClassName('button link-button')?.[0]?.click(); // IMEを強制終了させる const eventParams = { keyCode: 27, key: 'Escape', bubbles: true, cancelable: true, }; editor.dispatchEvent(new KeyboardEvent('keydown', eventParams)); //editor.dispatchEvent(new KeyboardEvent('keyup', eventParams)); break; default: break; } }); }
pass一旦別の入力欄にfocusを移す
どうやら #text-input からfocusが外れるとIMEが自動的に確定されるみたい?
21:54:16 ビンゴ!
あとは確定して流し込まれた文字列を削除すればいい
ScrapVim-liteでも使っている方法を流用する
どのcomposition系eventで捕捉できるかな?
e.data の文字列が流し込まれるんだった。
じゃあこれ使えばいいか。
scrapboxへ入力した文字は#text-inputから取得する方法を使えばもっとシンプルになるかな?
test2.js
export function execute() { const textInput = document.getElementById('text-input'); document.addEventListener('compositionupdate', e => { const buttons = document.getElementsByClassName('popup-menu') ?.[0]?.getElementsByClassName('button') if (!buttons) return; // そもそもpopup menuがなかったら何もしない if (e.data.length === 0) return; switch(e.data.split('').pop()) { case '「': //e.preventDefault(); //e.stopPropagation(); document.getElementsByClassName('button link-button')?.[0]?.click(); // IMEの文字列を強制的に確定させる textInput.blur(); // 確定して流し込まれた文字列を削除する const deleteParam = {keyCode: 8, key: 'Backspace', bubbles: true, cancelable: true}; e.data.split('').forEach(() =>{ textInput.dispatchEvent(new KeyboardEvent('keydown', deleteParam)); textInput.dispatchEvent(new KeyboardEvent('keyup', deleteParam)); }); // カーソルのfocusを戻す textInput.focus(); break; default: break; } }); }

#2021-06-28 13:59:39
#2021-01-20 21:38:46