2

私が書いていない JavaScript ルーチンを使用しています。onkeydown不要なキーストロークを防ぐために、テキスト ボックスの属性から呼び出されます。

最初の引数は明らかに使用されていません。2 番目の引数は、許可される文字のリストです。

function RestrictChars(evt, chars) {
    var key;
    var keychar;

    if (window.event)
        key = window.event.keyCode;
    else if (e)
        key = e.which;
    else
        return true;

    keychar = String.fromCharCode(key);

    if ((key == null) || (key == 0) || (key == 8) ||
        (key == 9) || (key == 13) || (key == 27))
        // Control key
        return true;
    else if (((chars).indexOf(keychar) > -1))
        return true;
    else
        return false;
}

これは英数字で機能するようです。ただし、 や などの文字は、これらの文字がパラメーターに含まれている場合でも、この関数が を返す原因.となります。たとえば、キーが押されると、190 に設定され、「3/4」文字に設定されます。/falsechars.keykeychar

これがどのように機能するのか、および/またはなぜ機能しないのか、誰にもわかりますか? 私は、JavaScript が何をしようとしているのかを理解するのに十分な知識がありません。

4

2 に答える 2

5

これには 2 つの問題があります。まず、入力された文字を分析している場合は、keypress代わりにイベントを使用する必要がありますkeydown。これは、入力された実際の文字について信頼できる情報を提供する唯一のイベントだからです。これと一般的な JavaScript キー イベントに関する (多くの) 詳細については、http://unixpapa.com/js/key.htmlを参照してください。e第 2 に、パラメータに対応していない (しかし対応すべきである)という変数への参照がありevtます。

textBoxテキスト入力要素を参照すると呼ばれる変数があると仮定して、ここに書き直します。

jsFiddle: http://jsfiddle.net/9DZwL/

コード:

function isKeypressCharValid(e, chars) {
    e = e || window.event;

    // Allow delete, tab, enter and escape keys through
    if (/^(8|9|13|27)$/.test("" + e.keyCode)) {
        return true;
    }

    var charCode = (typeof e.which == "number") ? e.which : e.keyCode;
    var charTyped = String.fromCharCode(charCode);
    return chars.indexOf(charTyped) > -1;
}

textBox.onkeypress = function(evt) {
    if (!isKeypressCharValid(evt, "abc123")) {
        return false;
    }
};
于 2011-06-24T23:51:58.843 に答える
1

私もJSの人ではありませんが...どのように動作するのか説明できます。ただし、あなたが言及したキーの値を取得している理由はわかりません。

keychar = String.fromCharCode(key);

これは、キーが印刷可能な文字 (文字、句読点など) であるかどうかを確認します。

if ((key == null) || (key == 0) || (key == 8) ||
    (key == 9) || (key == 13) || (key == 27))
    // Control key

上記は、キーが null OR ( ||)` 0 または 8 (バックスペース) または 9 (タブ) または 13 (0x0D または ENTER) または 27 (0x1B または ESCAPE) であるかどうかを確認します。これは、まさに期待どおりのブール値の結果です。 : IF <この条件> または <その条件> または <別の条件> または ...

else if (((chars).indexOf(keychar) > -1))

これは、パラメータkeycharとして渡された文字列に が含まれているかどうかを確認しますchars

于 2011-06-25T00:30:13.757 に答える