改变按键

在input框或contenteditable =真正div,如何修改字母“a”的按键返回字母“b”的键击? 也就是说,每次在div中input字母“a”时,输出实际上是字母“b”。

我并不担心在IE中可以使用的解决scheme – 只能在Safari,Chrome和FF上运行。

在Chrome中,我可以看到按键事件具有属性“charCode”,“keyCode”和“which”,所有这些都被分配了按键事件编号。 如果我在一个按键上触发一个事件,我可以修改这些值,但我不知道要返回什么,以便键入的实际键是不同的。 例如:

$(window).keypress(function(e){ //$(window) is a jQuery object e.charCode = 102; e.which = 102; e.keyCode = 102; console.log(e); return e; }); 

我还可以看到,charCode和keyCode还有一个“originalEvent”属性,它又具有这些属性。 但是,我一直无法修改这些(我尝试了像e.originalEvent.charCode = 102)。

您不能更改与某个按键事件关联的字符或按键,或者完全模拟按键事件。 但是,您可以自己处理按键,并在当前插入点/插入符处手动插入所需的字符。 我已经提供了代码在Stack Overflow的许多地方做这个。 对于一个contenteditable要素:

  • 需要将光标位置设置到contentEditable div的末尾,使用select和范围对象进行处理

这是一个jsFiddle的例子: http : //www.jsfiddle.net/Ukkmu/4/

对于input:

  • 我可以有条件地改变键入input的字符?

  • 在谷歌浏览器中显示不同的键盘字符

跨浏览器的jsFiddle例子: http : //www.jsfiddle.net/EXH2k/6/

IE> = 9和非IE jsFiddle例子: http : //www.jsfiddle.net/EXH2k/7/

那么你可以为<input><textarea>做些什么,只要确保该值没有任何“a”字符就可以了:

 $('input.whatever').keypress(function() { var inp = this; setTimeout(function() { inp.value = inp.value.replace(/a/g, 'b'); }, 0); }); 

这种方法可能无法处理所有可能的技巧,用真正换出“压制”字符的东西,但是我不知道有什么办法可以做到这一点。

编辑 – 哦,我在那个例子里input了一个超时处理程序中的“fixup”的原因是,它确保浏览器有机会处理“keypress”事件的原生行为。 当超时处理程序代码运行时,我们确信元素的值将被更新。 我意识到,这个代码有一些邪恶的东西。

我的解决scheme示例(在input[type=text]中将字符','更改为'.' ):

 element.addEventListener('keydown', function (event) { if(event.key === ','){ setTimeout(function() { event.target.value += '.'; }, 4); event.preventDefault(); }; 

我不确定这是否是“容易”可行的,如下所示:

 $(window).keypress(function(e) { //Captures 'a' or 'A' if(e.which == 97 || e.which == 65) { //Simulate a keypress in a specific field } }); 

我知道jQuery有一个模拟插件来模拟按键事件等, jQuery模拟 。 这可能是值得研究的 – 也可能是某种types的jQuery Trigger()事件。