jsで中国語入力方式を使用するとkeyCodeが229

1708 ワード

最近開発されたIMでは、QAがBUGを検出し、中国語入力方式で@を入力した場合、選択待ちリストはポップアップされませんが、英語入力方式でよいのは不思議ですが、デバッグツールを開けてみると、jqueryのkeydownイベントで取得したkeyCodeの値は229であり、期待した値ではありません.PS:IMはElectronフレームワークを用いて開発され,入力ボックスに@を入力すると,@できる人のリストがポップアップする.
コードは次のとおりです.
//           
$('#chat-input-area').keydown(function (e) {
    if (e.key == '@') {
        //     ...
    }
});

ネット上で多くの方案を検索して、結果はすべて駄目で、この問題は解がないようで、原因は、中国語の入力法がまだ処理しているため、呼び出し者に先に1つの値を返すことができて、しかしjsの中で値を受信して更に処理することはできなくて、だから中国語の入力法の下で手に入れたkeyCodeはすべて229で、ネット上で良い方案がない以上、それでは最も愚かな方法を採用するしかありません.入力ボックスの値を記録するたびに、再び入力するときに現在の値と前回記録した値をdiffにして、それから違い、つまり最後に入力したデータを手に入れますが、このdiffアルゴリズムの効率が鍵になり、1文字1文字の対比では、その効率は高くないに違いありません.現在の焦点のインデックスを手に入れて、それから1を減らします.最後の入力文字を得ることができますが、現在のインデックスを取得するのは複雑です.特に入力ボックスには表情などの特殊な文字がある可能性があります.だから、ずっと怠け者な私はdiff案を選びました.このオープンソースライブラリを使って、diffのスピードは速いです.https://github.com/jhchen/fast-diff コードの一部を次に示します.
const diff = require('fast-diff');
let inputContent = '';

//           
$('#chat-input-area').on('input', function (e) {
    let innerText = $('#chat-input-area')[0].innerText;
    let d = diff(inputContent, innerText);
    // console.log('diff result = ', d);
    inputContent = innerText;
    
    let isAt = false;
    if (!empty(d)) {
        for (let i = 0; i < d.length; i++) {
            if (d[i][0] == diff.INSERT && d[i][1].trimLeft(' ') == '@') {
                isAt = true;
                break;
            }
        }
    }

    if (!isAt) {
        return;
    }
    
    //   @
    // ...
});


テストして、3 k+の1篇の文章copyは中に入って、それからShift+2を押して、@弾窓は基本的に秒が開いて、全然遅く感じなくて、効率はまあまあです.