[Javascript] الحصول على قيمة الأحرف من KeyCode في جافا سكريبت ... ثم تقليم


Answers

في تجربتي String.fromCharCode(e.keyCode) غير موثوق به. يتوقع String.fromCharCode charcodes unicode كوسيطة؛ e.keyCode يعود javascript e.keyCode . رموز المفاتيح Javascript و charcodes unicode ليست هي الشيء نفسه! على وجه الخصوص ، ترجع مفاتيح لوحة الأرقام رمز مفتاح مختلفًا من مفاتيح الأرقام العادية (حيث أنها مفاتيح مختلفة) بينما يتم إرجاع نفس رمز المفتاح لكل من lowercase الكبيرة lowercase (قمت بالضغط على نفس المفتاح في كلتا الحالتين) ، على الرغم من وجود charcodes مختلفة .

على سبيل المثال ، يولد المفتاح الرقم 1 العادي حدثًا باستخدام رمز المفتاح 49 أثناء إنشاء مفتاح لوحة الأرقام 1 (باستخدام Numlock ) رمز المفتاح 97. يستخدم String.fromCharCode نحصل على ما يلي:

String.fromCharCode(49) returns "1"
String.fromCharCode(97) returns "a"

تتوقع String.fromCharCode رموز تعريف unicode ، وليس رموز مفاتيح جافا سكريبت. المفتاح a يولد حدث keycode لـ 65 ، مستقل عن حالة الحرف الذي سيولده (يوجد أيضاً معدِّل إذا تم الضغط على مفتاح Shift ، إلخ في الحدث). يحتوي الحرف a على charcode unicode من 61 بينما يحتوي الحرف A على charcode 41 (وفقاً ، على سبيل المثال ، http://www.utf8-chartable.de/ ). ومع ذلك ، فهذه قيم hex ، حيث يعطينا التحويل إلى الرقم العشري charcode لـ 65 لـ "A" و 97 لـ "a". [1] هذا يتفق مع ما نحصل عليه من String.fromCharCode لهذه القيم.

اقتصرت متطلباتي الخاصة على معالجة الأرقام والحروف العادية (قبول أو رفض اعتماداً على الموضع في السلسلة) والسماح لشخصيات التحكم ( F -keys، Ctrl -something) through. وهكذا يمكنني التحقق من أحرف التحكم ، إذا لم يكن حرف تحكم أتحقق من نطاق ما ، وعندها فقط أحتاج إلى الحصول على الحرف الفعلي. نظرًا لأنني لست قلقًا بشأن الحالة (أقوم بتغيير كل الحروف إلى أحرف كبيرة) وقمت بالفعل بتحديد نطاق رموز المفاتيح ، فلا داعي للقلق بشأن مفاتيح لوحة الأرقام. ما يلي يكفي لذلك:

String.fromCharCode((96 <= key && key <= 105)? key-48 : key)

بشكل أكثر عمومية ، ستكون وظيفة إعادة الحرف من رمز charcode (ربما charcode jQuery) ، لكن ليس لدي وقت charcode الآن. آسف.

أود أن أذكر أيضا e.which (إذا كنت تستخدم jQuery) التي تطبع e.keyCode و e.charCode ، بحيث لا داعي للقلق حول نوع المفتاح الذي تم الضغط عليه. تبقى مشكلة String.fromCharCode مع String.fromCharCode .

[1] كنت مرتبكة لفترة من الوقت. كل المستندات تقول أن charcode تتوقع رمز charcode unicode ، بينما في الواقع يبدو أنها تعمل على رموز ASCII ، ولكن هذا كان بسبب الحاجة إلى التحويل إلى عشري من hex ، جنبا إلى جنب مع حقيقة أن رموز الشيفرة ASCII و Unicode decimal تتداخل رموز charcodes للحروف اللاتينية العادية.

Question

هذا ما لدي الآن:

$("input").bind("keydown",function(e){
    var value = this.value + String.fromCharCode(e.keyCode);
}

إذا كان e.keyCode قد لا يكون حرف ASCII ( Alt ، backspace ، del ، والأسهم ، إلخ.) ... سأحتاج الآن إلى trim هذه القيم من value بطريقة ما (يفضل أن تكون برمجيًا - وليس مع جداول البحث).

أنا أستخدم jQuery.

يجب أن أستخدم حدث keydown . لا ينشط keyPress لمفاتيح معينة أحتاج لالتقاطها ( Esc و del و Backspace وما إلى ذلك).

لا يمكنني استخدام setTimeout للحصول على قيمة الإدخال. setTimeout(function(){},0) بطيء جدًا.




مجرد ملاحظة مهمة: لن تعمل الإجابة المقبولة أعلاه بشكل صحيح لـ keyCode> = 144 ، أي الفترة ، الفاصلة ، الشرطة ، إلخ. وبالنسبة لتلك يجب استخدام خوارزمية أكثر عمومية:

let chrCode = keyCode - 48 * Math.floor(keyCode / 48);
let chr = String.fromCharCode((96 <= keyCode) ? chrCode: keyCode);

إذا كنت مهتمًا بالسبب ، فهذه ضرورية بسبب سلوك وظيفة JS المضمنة String.fromCharCode() . بالنسبة لقيم keyCode <= 96 ، يبدو أنها تستخدم الخريطة:

chrCode = keyCode - 48 * Math.floor(keyCode / 48)

بالنسبة لقيم keyCode > 96 ، يبدو أنها تقوم keyCode > 96 باستخدام الوظيفة:

chrCode = keyCode

إذا كان هذا يبدو وكأنه سلوك غريب ثم حسنا .. أنا أتفق. للأسف ، سيكون بعيداً جداً عن أغرب شيء رأيته في جوهر JS.

document.onkeydown = function(e) {
    let keyCode = e.keyCode;
    let chrCode = keyCode - 48 * Math.floor(keyCode / 48);
    let chr = String.fromCharCode((96 <= keyCode) ? chrCode: keyCode);
    console.log(chr);
};
<input type="text" placeholder="Focus and Type"/>




ردا على هذه المشكلة كتبت للتو المساعد jQuery: https://github.com/bpeacock/key-to-charCode/

أنها قليلاً أسفل وقذرة ويمكن دمجها بشكل أفضل في jQuery ، ولكن ابدأ.




كتبت مؤخرًا وحدة تسمى keysight تُترجم keysight keypress و keydown و keyup إلى أحرف ومفاتيح على التوالي.

مثال:

 element.addEventListener("keydown", function(event) {
    var character = keysight(event).char
 })