javascriptからIMEをcancelする
Scrapboxで確認済み
他のサイトでも使えるかもしれない
方法
正攻法はない
Escape
キーを何らかの要素に渡してkey eventを発火させたらどうだろうか?
<text-input>
に直接渡すのは無理だった
別の要素に渡すのはどうだろうか?
Scrapboxなら、 #editor
に渡したらどうだ?
試してみるか。
21:46:05 だめだった
最初入力した 「
は表示されたまま
その後何か入力すると、変換中の文字が何も表示されなくなる
変換候補だけが見える
変換中の文字を一旦全部消してからまた入力すると復活する
test1.jsexport 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;
}
});
}
一旦別の入力欄にfocusを移す
どうやら #text-input
からfocusが外れるとIMEが自動的に確定されるみたい?
21:54:16 ビンゴ!
あとは確定して流し込まれた文字列を削除すればいい
どのcomposition系eventで捕捉できるかな?
e.data
の文字列が流し込まれるんだった。
じゃあこれ使えばいいか。
test2.jsexport 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;
}
});
}