如何更改Firefox中键入的字符

时间:2008-10-20 12:16:11

标签: javascript javascript-events

我需要在文本输入中更改字符'。'输入时'',' 在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中无法更改键事件中输入的字符。 有什么建议吗?

5 个答案:

答案 0 :(得分: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 指出了上述问题。它没有照顾插入位置不在文本的末尾。即使您在值中插入了一些文本,它也会将命令追加到最后。

解决方案是,而不是附加逗号,以模拟逗号键的按键事件。不幸的是,在不同的浏览器中调度合成事件的方式似乎表现出很多种类,并不是一件容易的事。我会看看能不能找到一个很好的通用方法。

答案 1 :(得分:2)

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

这是您需要的逻辑:监听所有关键事件。如果是句点,禁止该事件,并在光标位置手动添加逗号。 (这里是a code snippet,用于在光标位置插入任意文本。)

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

如果不是句号,请从处理程序中提前返回。

答案 2 :(得分:1)

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

document.getElementById('mytext').onkeyup = function(){
    this.value = this.value.replace('.', ',');
}

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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