このスニペットはトリックを行います。完璧ではありませんが、さらに発展させることができます。
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);
}
cmds
はパイプで区切られたすべての単語のリストであり、その後に 1 つの可視パラメーターが必要です。そのパラメーターの後には、次のスペースまでテキストフィールドに星が表示されます。コマンドがリストにない場合、3 番目のパラメーターは難読化されません。
同じ行でこれらの種類の組み合わせの複数の発生を検出したい場合は、以下の正規表現を使用してください。
rex = new RegExp('\\b' + cmd + ' [a-zA-Z0-9]+ (\\w*)', 'g'),
「コマンド テキスト」の実際の値は に格納されcommandString
ます。
この実装は、マウスまたはクリップボードによるテキスト編集に対して保護されていないことに注意してください。また、Firefox で実行すると、BACKSPACEユーザーが再度書き込みを開始する前にフィールドが空になりません。
jsFiddleでのライブ デモ。
編集
実際、あなたの質問はEvent
オブジェクト プロパティのオーバーライドに関するものでした。一般に、これらのプロパティは読み取り専用であり、変更できません。ただし、ルールには例外があるようです。少なくとも IE9 では、insideハンドラの変更が許可されていwindow.event.keyCode
ます。onkeypress
以下のスニペットは、 inline を呼び出すときに IE9 で実際に機能しますがonkeypress=capitalize()
、 によってアタッチされたハンドラーでは機能しませんaddEventListener()
。
function capitalize() {
key = window.event.keyCode;
if (key > 96 && key < 123) {
window.event.keyCode = window.event.keyCode - 32;
}
return window.event.keyCode;
}