6

我需要在文本输入中更改字符“。” 键入时到“,”。在 IE 中,我更改了 keypress 事件中的 keyCode 事件属性,如下所示

document.getElementById('mytext').onkeypress = 
 function (evt) {
  var e = evt || window.event;
  if (e.keyCode && e.keyCode==46)
   e.keyCode = 44;
  else if (e.which && e.which==46) {
   e.which = 44;
  }
 };

但似乎在 Firefox 中无法更改在关键事件中键入的字符。有什么建议么?

4

5 回答 5

5

尝试这个。它适用于所有浏览器:

window.onload = function () {
    var input = document.getElementById("mytext");

    input.onkeypress = function () {
        var evt = arguments[0] || event;
        var char = String.fromCharCode(evt.which || evt.keyCode);

        // Is it a period?
        if (char == ".") {
            // Replace it with a comma
            input.value += ",";

            // Cancel the original event
            evt.cancelBubble = true;
            return false;
        }
    }
};

更新: Pier Luigi指出了上述问题。它不会处理不在文本末尾的插入符号位置。即使您在值中插入一些文本,它也会将命令附加到末尾。

解决方案是模拟逗号键的按键事件,而不是附加逗号。不幸的是,在不同浏览器中分发合成事件的方式似乎多种多样,而且并非易事。我会看看我是否能找到一个很好的通用方法。

于 2008-10-20T12:20:05.100 回答
2

假设 Event 对象中的所有属性都是不可变的。DOM 规范没有解决手动更改这些值时发生的情况。

这是您需要的逻辑:监听所有关键事件。如果是句号,则取消事件,并在光标位置手动添加逗号。(这是在光标位置插入任意文本的代码片段。)

您可以通过调用event.preventDefault();来抑制 Firefox 中的事件。这告诉浏览器不要继续执行与此事件关联的默认操作(在这种情况下,键入字符)。您可以通过设置event.returnValue来抑制 IE 中的事件false

如果不是期间,请尽早从您的处理程序返回。

于 2008-10-20T14:51:46.773 回答
1

从技术上讲,您只想用逗号替换所有点。

document.getElementById('mytext').onkeyup = function(){
    this.value = this.value.replace('.', ',');
}
于 2008-10-20T13:25:21.677 回答
1

如果我查看官方Document Object Model Events文档,鼠标事件字段被定义为只读。那里没有定义键盘事件,我想 Mozilla 为他们遵循了这个政策。

所以基本上,除非有一些聪明的技巧,否则你不能以你想要的方式改变一个事件。您可能必须截取密钥并在插入符号所在的位置插入字符(原始或翻译),就像 JS HTML 编辑器所做的那样。

于 2008-10-20T15:12:47.123 回答
0

这真的需要即时完成吗?如果您正在收集要发布到表单或提交到数据库的信息,那么在提交后修改数据不是更好吗?这样用户就永远不会看到令人困惑的变化。

于 2008-10-20T15:00:00.673 回答