检测组合字符以忽略其中一些

mat*_*ieu 5 html javascript safari firefox google-chrome

我正在编写一个基于 contenteditable 的小部件,它需要自己处理文本输入。处理 ascii 和非 ascii 字符相当容易,如下所示:

container_element.addEventListener('keypress', function(event) {
    if (event.ctrlKey || event.altKey || event.metaKey) {
        return;
    }
    if (event.which != 0 && event.charCode != 0) {
        event.preventDefault();
        var c = String.fromCharCode(event.which);
        handle_character(c);
    }
});
Run Code Online (Sandbox Code Playgroud)

现在,如果我将本地系统配置为通过死键组合输入非 ASCII 字符(例如 altgr),则上述操作会严重失败。像谷歌文档这样的精美编辑器似乎可以在各种操作系统和浏览器上很好地处理这种情况,而无需任何外部插件,因此,很明显,这浏览器触发的事件中检测从组合中生成哪个字符死键序列。

然而,我一直无法弄清楚到底是怎么回事(甚至对于单个浏览器/操作系统组合,例如 Chrome/Linux)。

因此我的问题是:当我们获得死键组合序列时,有人知道如何检测从按键或按键处理程序输入哪个字符吗?

y_n*_*_nk 5

看来我不是唯一一个在寻找它的人:)我刚刚发现了一堆与组合状态相关的事件,可能适合您的需要。当我处于组合字符中间时,我用它来阻止键盘事件。关键是添加一个简单的:

var block = false;
input.addEventListener('compositionstart', function() { block = true; });
input.addEventListener('compositionend', function() { block = false; });
Run Code Online (Sandbox Code Playgroud)

并稍后在输入事件的代码中使用它:

input.addEventListener('input', function() {
    if (block) { return; }
    console.log(input.value);
});
Run Code Online (Sandbox Code Playgroud)

演示: http: //jsfiddle.net/kde4gvxn/1/