2

eventオブジェクトのプロパティの一部を変更することで、テキスト フィールドに書かれている文字を簡単に変更することはできますか? たとえば、コマンドからパスワード文字を非表示にしたい:
ユーザータイプ:

ログイン ユーザー名 パスワード

出演したい:

ログインユーザー名********

パスワードを変数に保存します。*だから、私は任意のキーを一度に再マップしたいと思いtextbox.valueます/^login [a-zA-Z0-9]+ /

編集- 私の質問の誤解についてコメントに敬意を表して:上記のすべてが小さなコマンド ライン クライアント内で発生し、難読化
によって保護したいコマンドが複数ある可能性があるため、使用する考えは受け入れられません!*<input type="password" />

4

2 に答える 2

2

このスニペットはトリックを行います。完璧ではありませんが、さらに発展させることができます。

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;
}
于 2013-02-27T19:40:13.507 に答える
1

を使用できますが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;   
}
于 2013-02-27T15:02:16.097 に答える