Javascript 更改事件输入字符

Javascript 更改事件输入字符,javascript,keypress,keyevent,Javascript,Keypress,Keyevent,是否可以通过更改一些事件对象属性来简单地更改写入文本字段的字符?例如,我想对命令隐藏密码字符: 用户类型: 登录用户名密码 我想出现: 登录用户名****** 并将密码保存到变量。因此,我想在文本框中包含/^login[a-zA-Z0-9]+/后,将任何键重新映射到* 编辑-尊敬地回答关于误解的评论我的问题: 因为以上所有操作都发生在一个小的命令行客户端中,并且可能有多个命令,我可能希望通过*模糊处理来保护这些命令,所以使用的想法是不可接受的 您可以使用input type=password,但

是否可以通过更改一些
事件
对象属性来简单地更改写入文本字段的字符?例如,我想对命令隐藏密码字符:
用户类型:

登录用户名密码

我想出现:

登录用户名
******

并将密码保存到变量。因此,我想在
文本框中包含
/^login[a-zA-Z0-9]+/
后,将任何键重新映射到
*

编辑-尊敬地回答关于误解的评论我的问题:

因为以上所有操作都发生在一个小的命令行客户端中,并且可能有多个命令,我可能希望通过
*
模糊处理来保护这些命令,所以使用
的想法是不可接受的

您可以使用
input type=password
,但出于任何其他原因,下面的脚本将为您完成这项工作

var field = document.getElementById("password")
var val= "";
field.onkeydown = function(evt){
    val+= String.fromCharCode(evt.keyCode)      
    this.value = val.replace(/./g,"*");      
   document.getElementById("hiddenfieldPassword").value = val; // Hidden Field to store the password.
  return false;   
}

这段代码就完成了。它并不完美,但可以进一步发展

window.onload = function () {
    var cmdfield = document.getElementById('cmdfield'),
        commandString = '',
        cmds = '(login|logout)',
        rex = new RegExp('^' + cmds + ' [a-zA-Z0-9]+ (\\w*)'),
        keyPress = function (e) {       
            if ((e.which > 64 && e.which < 123) || (e.which > 47 && e.which < 58) || e.which === 32) {
                commandString += String.fromCharCode(e.which);
                this.value = commandString.replace(rex, function (m, a, b) {
                    var command = m.split(' ')[0],
                        param = m.split(' ')[1],
                        len = b.length;
                    if (len > 0) {
                        return command + ' ' + param + ' ' + new Array(len + 1).join('*');
                    }
                    if (len === 0) {
                        return command + ' ' + param + ' ';
                    }
                });
            }
            e.preventDefault();
            return;
        },
        keyDown = function (e) {
            if (e.which === 8) {
                commandString = commandString.substring(0, commandString.length - 1);
                e.stopPropagation();
                return;
            }
            if (!((e.which > 64 && e.which < 122) || (e.which > 47 && e.which < 58) || e.which === 32)) {
                e.preventDefault();
            }
            return;
        };
    cmdfield.addEventListener('keydown', keyDown, false);
    cmdfield.addEventListener('keypress', keyPress, false);
}
“命令文本”的实际值存储在
commandString

请注意,此实现不受鼠标或剪贴板编辑文本的保护。同样,在Firefox上运行时,在用户再次开始写入之前,BACKSPACE不会清空字段

现场演示


编辑

实际上,您的问题是关于重写
事件
对象属性。通常,这些属性是只读的,不能修改。但是,该规则似乎有一个例外:至少IE9允许在
onkeypress
处理程序中修改
window.event.keyCode
。当调用inline
onkeypress=capitalize()
时,下面的代码片段在IE9中确实有效,但与由
addEventListener()附加的处理程序无关

函数大写(){
key=window.event.keyCode;
如果(键>96&&键<123){
window.event.keyCode=window.event.keyCode-32;
}
返回window.event.keyCode;
}

你没有使用
有什么原因吗?你可以使用一个密码字段,假设你在html上使用JS?伙计,我想如果我写
登录用户名密码
,这就足够明显了,我们说的是命令行!不,这绝对不明显。你提到了文本字段。这将是什么样的命令行?@TomášZato我已经为你建立了一个命令行。它并不完美,但使用一个已知的命令(如
login
)来完成这项工作。FF和
BACKSPACE
也有问题,但也许您可以进一步开发代码。使用箭头键和其他非字符键试试。使用SHIFT尝试此操作-案例将被忽略。最后,不要忘记输入的命令不能消失!我做了一些JS提琴来告诉你,你的代码并没有真正起作用-非常感谢,这会激励我。我接受了这个,尽管这不是我问题的答案-如何改变实际的角色。我相信这是不可能直接实现的,尽管可以通过
window.dispatchEvent()
实现。我已经看到只在IE和
onkeypress
中工作,恐怕这是唯一跨浏览器的方式。带有代码的问题,适用于IE。它肯定只能适用于onkeypress,但事实上,只有在IE中,密钥ID不是只读的,这对我来说意味着坏消息。@TomášZato我在回答中添加了一些关于IE中只读问题的信息。
rex = new RegExp('\\b' + cmd + ' [a-zA-Z0-9]+ (\\w*)', 'g'),
function capitalize() {
    key = window.event.keyCode;
    if (key > 96 && key < 123) {
        window.event.keyCode = window.event.keyCode - 32;
    }
    return window.event.keyCode;
}