我需要在文本输入中更改字符'。'输入时'',' 在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中无法更改键事件中输入的字符。 有什么建议吗?
答案 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)
这是否真的需要动态完成?如果您要收集要发布到表单或提交到数据库的信息,那么在提交数据后修改数据会不会更好?这样,用户永远不会看到令人困惑的变化。