49

問題:

  • HTML 入力で許可される文字を az AZ のみに制限します。
  • ビジネス要件では、これは KeyPress で行う必要があるため、文字が入力に表示されることさえ許可されません。
  • タブ、エンター、矢印、バックスペース、シフトはすべて許可されています。ユーザーは、テキストボックスに自由に出入りしたり、文字を削除したりできる必要があります。

これが私のコードの出発点です...

var keyCode = (e.keyCode ? e.keyCode : e.which);

ただし、keyCodeで取得したすべての値は、Web で見た文字チャートのいずれにも対応していません。たとえば、文字 "h" は 104 のリターン コードを返します。

KeyCode は CharCode とは異なりますか? 制御文字を含むコードはどれですか? 変換する必要がありますか?

入力を az AZ に制限し、JavaScript で必要なキーを許可するにはどうすればよいですか?

4

8 に答える 8

70

すべての質問に対する回答は、次のページにあります。

...しかし、要約すると:

  • (キー コード情報ではなく) 文字情報を確実に取得できる唯一のイベントは、keypressイベントです。
  • イベントではkeypress、IE <= 8 を除くすべてのブラウザが、文字コードをイベントのwhichプロパティに保存します。これらのブラウザのすべてではありませんが、ほとんどがcharCodeプロパティに文字コードも保存します。
  • イベントのkeypress場合、IE <= 8 は文字コードをkeyCodeプロパティに格納します。

これは、キー押下に対応する文字コードを取得することを意味します。キー押下イベント オブジェクトが という変数に格納されていると仮定すると、以下はどこでも機能しますe

var charCode = (typeof e.which == "number") ? e.which : e.keyCode

これは通常、文字コードが存在する場合は文字コードを返し、そうでない場合は 0 を返します。ゼロ以外の値を取得してはならない場合がいくつかあります。

  • Opera < 10.50 では、キーInsertDeleteHomeおよびEnd
  • 非文字キー用の Konqueror の最近のバージョン。

最初の問題の回避策は少し複雑で、keydownイベントも使用する必要があります。

于 2010-11-26T13:45:23.380 に答える
10

やれやれだぜ。KeyboardEvent.[key, char, keyCode, charCode, which] は、Mozilla の API ドキュメント ( https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent )によると、すべて非推奨であるか、現在未解決のバグがあります。JQuery でさえ、これに負担をかけ、ユーザーにそれを理解させます https://api.jquery.com/keydown/

于 2014-02-14T17:01:15.160 に答える
5

実際には、104 は小文字の 'h' の ASCII コードです。キーを押して入力した文字の ASCII コードを取得するには、 を使用するだけでよく、e.which || e.keyCodeキーを押し続けることを心配する必要はありません。 unixpapa.com/js/key.html )。

したがって、本当に必要なのは次のとおりです。

<input id="textbox">

<script type="text/javascript">
document.getElementById('textbox').onkeypress = function(e){
  var c = e.which || e.keyCode;
  if((c > 31 && c < 65) || (c > 90 && c < 97) || (c > 122 && c !== 127))
    return false;
};
</script>

試してみてください: http://jsfiddle.net/wcDCJ/1/

(ASCII コードはhttp://en.wikipedia.org/wiki/Asciiからのものです)

于 2010-11-26T21:15:20.273 に答える
2

onKeyPress は、大文字と小文字で異なるコードを持っています。キャップロックをオンにしてから文字を入力すると、期待するコードが得られることに気付くでしょう。

onKeyUp と onKeyDown は、大文字と小文字の文字コードが同じです。onKeyPress に最も近い onKeyUp を使用することをお勧めします。

于 2010-11-26T13:30:50.533 に答える
0

マークアップの例を次に示します。

<form id="formID">
    <input type="text" id="filteredInput">
    <input type="text" id="anotherInput">
</form>

次のロジックを使用して、キーボード入力をトラップできます (この場合、jQuery ドキュメント対応ラッパーを介して)。

少し間抜けに見えるかもしれませんが、基本的に、許可したいすべてのものをチェックし(あなたの場合、AからZまでの文字は大文字と小文字を区別しません)、何もしません. つまり、デフォルトのアクションは許可されますが、アルファ以外の入力は禁止されます。

矢印キー、Home、End、Tab、Backspace、Delete などの標準的なキーボード ナビゲーションがチェックされ、許可されます。

注: このコードはもともと、英数字 (A ~ Z、a ~ z、0 ~ 9) のみを許可するユーザー入力を満たすために作成されたもので、これらの行はそのままコメントとして残しました。

        <script>
            jQuery( document ).ready( function() {

                // keydown is used to filter input
                jQuery( "#formID input" ).keydown( function( e ) {
                    var _key = e.which
                        , _keyCode = e.keyCode
                        , _shifted = e.shiftKey
                        , _altKey = e.altKey
                        , _controlKey = e.ctrlKey
                    ;
                    //console.log( _key + ' ' + _keyCode + ' ' + _shifted + ' ' + _altKey + ' ' + _controlKey );

                    if( this.id === jQuery( '#filteredInput' ).prop( 'id' ) ) {
                        if(
                            // BACK,         TAB
                            ( _key === 8 || _key === 9 )    // normal keyboard nav
                        ){}

                        else if(
                            // END,           HOME,          LEFT,          UP,            RIGHT,         DOWN
                            ( _key === 35 || _key === 36 || _key === 37 || _key === 38 || _key === 39 || _key === 40 )  // normal keyboard nav
                        ){}

                        else if(
                            // DELETE
                            ( _key === 46 ) // normal keyboard nav
                        ){}

                        else if(
                            ( _key >= 65 && _key <= 90 )    // a- z

                            //( _key >= 48 && _key <=  57 && _shifted !== true ) ||   // 0 - 9 (unshifted)
                            //( _key >= 65 && _key <=  90 ) ||                        // a- z
                            //( _key >= 96 && _key <= 105 )                           // number pad 0- 9
                        ){}

                        else {
                            e.preventDefault();
                        }
                    }

                });
            });
        </script>
于 2015-07-21T22:41:55.727 に答える
0

/* 印刷されないキーの場合、keypress では keyCode を取得できません。*/

function passkeycode(e){
    e= e || window.event;
    var xtrakeys={
        k8: 'Backspace', k9: 'Tab', k13: 'Enter', k16: 'Shift', k20: 'Caps Lock',
        k35: 'End', k36: 'Home', k37: 'Ar Left', k38: 'Ar Up', k39: 'Ar Right',
        k40: 'Ar Down', k45: 'Insert', k46: 'Delete'
    },
    kc= e.keyCode;
    if((kc> 64 && kc<91) || xtrakeys['k'+kc]) return true;
    else return false;
}

inputelement.onkeydown=passkeycode;

kc> 64 && kc<91 // a-zA-Z

xtrakeys['k'+integer]) 許可される特別なキーコードを定義します

于 2010-11-26T14:54:42.560 に答える
-1

あなたは完全に間違ったアプローチを取っていると思います。次のようなものはどうですか:

<input id="test">

<script type="text/javascript">
var aToZ = function(el){
    if(this.value.match(/[^a-zA-Z]/)){
        this.value = this.value.replace(/[^a-zA-Z]+/, '')
    }
}
document.getElementById("test").onkeyup = aToZ
</script>

また、サーバー側でもチェックを繰り返すことを忘れないでください。

于 2010-11-26T15:09:12.603 に答える
-1

keyCode は ASCII キーの値を返すと思います。Ascii-104 は h.

http://www.asciitable.com/

Charcode は、別の回答で述べたように、一部のブラウザーで使用される代替手段です。

これは crssbrowser の例を含む記事です: http://santrajan.blogspot.com/2007/03/cross-browser-keyboard-handler.html

于 2010-11-26T13:25:15.710 に答える