2011-01-05 32 views
18

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

我不是那种在IE中工作的解决方案 - 只有一种适用于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,其中,和键一起,还有一个“originalEvent”属性,它反过来也具有这些特性。但是,我一直无法修改这些(我尝试了诸如e.originalEvent.charCode = 102之类的东西)。

回答

24

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

这里的一个的jsfiddle例如:http://www.jsfiddle.net/Ukkmu/4/

对于输入:

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

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

+0

谢谢蒂姆。您在第一个链接中写入的函数insertTextAtCursor()可以做到这一点! – maxedison 2011-01-06 03:37:27

+0

非常感谢蒂姆,我完成了一天研究案例“如何将关键字更改为英语?”但我没有找到优化&小&Intelligible,直到找到你的答案。 – 2014-04-07 04:49:24

+0

我将实施“非IE jsFiddle示例”,并在堆栈和gitbub中共享,以帮助每个人。 实现支持所有其他语言。 再次感谢。 – 2014-04-07 05:00:08

1

你可以为一个<input><textarea>做那么什么是公正,确保该值不具有任何“一”字:

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

这种做法可能无法处理所有可能的这些技巧你可以用真正换出“压制”角色的东西来拉动,但我不知道有什么办法可以做到这一点。

编辑 —哦,那我在这个例子中键入与“修正”的超时处理发生的原因是,它可以确保浏览器有机会处理的“按键”本地行为事件。当超时处理程序代码运行时,我们确信元素的值将被更新。我意识到,这个代码有一点点的难度。

0

我不知道这是否是“容易”做,能,像这样的东西:

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

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

+2

“模拟”按键的代码会很难,因为它是将不得不找出文本字段或textarea中的当前光标位置或其他。此外,它应该确保返回'false'以防止按键的本机处理。 – Pointy 2011-01-05 14:46:18

+3

@Pointy:我写了这段代码。看到我的答案。 – 2011-01-05 14:47:29

+0

我同意 - 我只是将其作为一个非常基本的例子,这就是为什么我推荐Simulate插件的原因。我不确定它是多么深入,但它可能值得考虑OP。 – 2011-01-05 14:47:36

1

我的解决方案的例子(在input[type=text]字符',''.'变化):

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