سؤال

المشكلة:

  • الحد المسموح به الأحرف في إدخال HTML إلى AZ AZ فقط.
  • بالنسبة لمتطلبات العمل ، يجب القيام بذلك على keypress بحيث لا يُسمح للشخصية ببساطة بالظهور في المدخلات.
  • علامة التبويب ، أدخل ، الأسهم ، المسافة الخلفية ، التحول كلها مسموح بها. يجب أن يكون المستخدم قادرًا على الانتقال بحرية إلى داخل وخارج مربع النص ، وحذف الأحرف وما إلى ذلك.

هذه هي نقطة انطلاق الكود الخاص بي ...

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

لكن كل قيمة أحصل عليها رمز المفتاح لا يتوافق مع أي من المخططات الشخصية التي رأيتها على الويب. على سبيل المثال ، تعطيني الحرف "H" رمز إرجاع 104.

هل رمز Keycode مختلف عن charcode؟ أي رمز يحتوي على أحرف التحكم؟ هل أحتاج إلى التحويل؟

كيف يمكنني تقييد مدخلات AZ AZ والسماح للمفاتيح التي أحتاجها في JavaScript؟

هل كانت مفيدة؟

المحلول

يمكن العثور على إجابات على جميع أسئلتك الصفحة التالية.

... ولكن باختصار:

  • الحدث الوحيد الذي يمكنك من خلاله الحصول على معلومات شخصية (على عكس معلومات الكود الرئيسية) هو keypress حدث.
  • في ال keypress الحدث ، جميع المتصفحات باستثناء أي <= 8 تخزين رمز الأحرف في الحدث which منشأه. معظم ولكن ليس كل هذه المتصفحات أيضا تخزين رمز الأحرف في charCode منشأه.
  • في ال keypress الحدث ، أي <= 8 يخزن رمز الحرف في keyCode منشأه.

هذا يعني الحصول على رمز الحرف المقابل للمفترضات ، وسيعمل التالي في كل مكان ، على افتراض أن كائن حدث Keypress يتم تخزينه في متغير يسمى e:

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

سيؤدي هذا عمومًا إلى إرجاع رمز حرف حيث يوجد واحد و 0 خلاف ذلك. هناك بعض الحالات التي ستحصل فيها على قيمة غير صفرية عندما لا يجب عليك:

  • في الأوبرا <10.50 للمفاتيح إدراج, حذف, مسكن و نهاية
  • في الإصدارات الحديثة من Konqueror للمفاتيح غير الحشرية.

الحل المتغير للمشكلة الأولى هو متورط قليلاً ويتطلب استخدام keydown الحدث كذلك.

نصائح أخرى

حزن جيد. لوحة مفاتيح. https://developer.mozilla.org/en-us/docs/web/api/KeyboardEvent. حتى jQuery يمرر باك على هذا واحد ويتيح للمستخدم معرفة ذلك https://api.jquery.com/keydown/.

في الواقع ، 104 هو رمز ASCII للأحرف الصغيرة "H". للحصول على رمز ASCII للشخصية المكتوبة ، يمكنك فقط استخدام e.which || e.keyCode, ، ولا داعي للقلق بشأن المفاتيح المحتجزة لأنه بالنسبة للنص المكتوبة ، يتم تكرير Keypress تلقائيًا في جميع المتصفحات (وفقًا للممتازة http://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)

يحتوي Onkeypress على رموز مختلفة للأحرف العلوية والسفلية. من المحتمل أن تجد أن تشغيل قفل الغطاء ثم كتابة رسالتك سيعطيك الرمز الذي تتوقعه

لدى Onkeyup و Onkeydown نفس رموز الأحرف للأحرف العلوية والسفلية. سيوصي باستخدام OnKeyup لأنه الأقرب إلى Onkeypress

/* لن تحصل على رمز مفاتيح على مفاتيح المفاتيح غير المطبوعة ، لماذا لا تلتقطها على KeyDown بدلاً من ذلك؟ */

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]) الرموز الرئيسية الخاصة المسموح بها

هنا مثال على ذلك:

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

يمكن استخدام المنطق التالي لفخ إدخال لوحة المفاتيح (في هذه الحالة ، عبر غلاف جاهز مستند jQuery).

قد تقرأ القليل من الأبله ، لكن في الأساس ، أتحقق من كل شيء أريد السماح به (في حالتك ، الحروف من خلال Z غير حساسة) و لا تفعل شيئا. بمعنى آخر ، يُسمح بالإجراء الافتراضي ، ولكن يتم منع أي مدخل آخر غير ألفا.

يتم فحص التنقل القياسي في لوحة المفاتيح ، مثل مفاتيح السهم ، المنزل ، النهاية ، علامة التبويب ، المسافة الخلفية ، الحذف وما إلى ذلك.

ملاحظة: تمت كتابة هذا الرمز في الأصل لتلبية إدخال المستخدم الذي يسمح فقط بالقيم الأبجدية الرقمية (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>

أعتقد أن رمز KeyCode يعيد قيمة مفتاح ASCII ، ASCII-104 هو H.

http://www.asciitable.com/

يشير charcode كما هو موضح في إجابة أخرى بديل يستخدم في بعض المتصفحات.

فيما يلي مقال يحتوي على مثال CRSSBROWSER: http://santrajan.blogspot.com/2007/03/cross-browser-keyboard handler.html

أعتقد أنك تتخذ النهج الخاطئ تمامًا. ماذا عن شيء مثل:

<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>

أيضًا ، لا تنس تكرار جانب خادم الشيك أيضًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top