اضغط على مفتاح واقرأ كل خاصية من خصائص KeyboardEvent الناتج: key وcode وkeyCode وwhich وlocation وعلامات ctrl وshift وalt وmeta، بالإضافة إلى JSON قابل للنسخ.
اضغط على مفتاح. شاهد بالضبط ما يبلغ عنه المتصفح. انقر على منطقة الالتقاط بالأسفل واضغط على أي مفتاح أو تركيبة. تُعرض كل خاصية من خصائص KeyboardEvent جنبًا إلى جنب، بحيث يمكنك اختيار الخاصية الصحيحة لمعالج الاختصارات الخاص بك بدلاً من التخمين.
event.key
–
event.code
–
event.keyCode
–
event.which
–
event.location
–
المفاتيح المعدِّلة المضغوطة
بلا
key وcode وkeyCode ليست نفس الشيء
ثلاث خصائص، ثلاثة أسئلة مختلفة
يقدم KeyboardEvent عدة طرق لتحديد مفتاح، وهي تجيب على أسئلة مختلفة حقًا. event.key هو الحرف أو القيمة المسماة الناتجة عن ضغطة المفتاح بعد تطبيق التخطيط والمفاتيح المعدِّلة. الضغط على المفتاح الفعلي A يعطي a، أو A مع الضغط على shift، أو حرفًا مختلفًا تمامًا على تخطيط Dvorak أو AZERTY. تصل المفاتيح المسماة كسلاسل وصفية مثل Enter وEscape وArrowLeft وF5.
event.code يحدد موضع المفتاح الفعلي بدلاً من ذلك، باستخدام اسم مستقل عن التخطيط مستمد من لوحة مفاتيح أمريكية افتراضية. المفتاح في موضع A هو دائمًا KeyA، مهما كان التخطيط الذي ينتجه المستخدم. الأرقام على طول الصف العلوي هي Digit1 إلى Digit0، ولوحة الأرقام تبلغ عن Numpad1 وما يشابهها بحيث يمكنك التمييز بين صفي الأرقام.
event.keyCode وتوأمه event.which هما المعرّفان الرقميان القديمان. كلاهما مهجور رسميًا، وكلاهما ما زال مطبقًا في كل مكان، وكلاهما غير متسق عبر المتصفحات فيما يخص علامات الترقيم. يستحقان القراءة عندما تحافظ على كود قديم، لكن معالجة الاختصارات الجديدة يجب أن تستخدم key أو code.
الاختيار بين key وcode
القاعدة العامة بسيطة: استخدم code عندما يكون الموضع مهمًا وkey عندما يكون المعنى مهمًا. لعبة تربط الحركة بـ WASD تريد code، لأن المجموعة الفعلية تحت يد اللاعب اليسرى يجب أن تبقى في نفس المكان على لوحة مفاتيح AZERTY حتى وإن كانت تنتج ZQSD. محرر نصوص يربط "حفظ" بـ Ctrl+S يريد key، لأن المستخدم يفكر بمعنى حرف S وليس بالمفتاح بجوار A.
علامات المعدِّل هي قيم منطقية منفصلة: ctrlKey وshiftKey وaltKey وmetaKey. اختبرها صراحةً بدلاً من استنتاجها من key، وتذكر أن مفتاح الاختصار الأساسي هو Command على macOS وControl في الأماكن الأخرى. نمط شائع هو قبول event.metaKey || event.ctrlKey بحيث يغطي معالج واحد كلا النظامين.
event.location يميز المفاتيح المكررة. القيمة 0 للمفتاح القياسي، و1 للعضو الأيسر من زوج مثل Shift الأيسر، و2 للأيمن، و3 لمفتاح على لوحة الأرقام.
مخاطر عملية
لا يولد كل مفتاح الأحداث التي تتوقعها. يحتفظ المتصفح ببعض التركيبات لنفسه - Ctrl+W وCtrl+T وCommand+Q عادةً ما تغلق التبويبات أو تنهي التطبيق قبل أن تراها الصفحة، ولا يمكن لـ preventDefault استعادتها. اختبر أي اختصار في نافذة متصفح حقيقية بدلاً من افتراض أنه سيصل إلى معالجك.
الضغط باستمرار على مفتاح ينتج تدفقًا من أحداث التكرار مع تعيين event.repeat على true بعد الحدث الأول. تجاهل التكرارات عندما يجب أن يعمل الاختصار مرة واحدة، واحترمها عندما يكون السلوك مستمرًا، مثل التمرير أو تحريك المؤشر.
أخيرًا، يصف keydown وkeyup المفاتيح، بينما كان keypress يصف الأحرف وتمت إزالته من المعيار. لإدخال النص، فضل الاستماع إلى حدث input أو قراءة beforeinput، اللذين يتعاملان مع التركيب والإكمال التلقائي ولوحات المفاتيح المحمولة بشكل أكثر موثوقية بكثير من أي حدث على مستوى المفتاح.
الأسئلة الشائعة
هل يجب أن أستخدم key أم code لاختصار لوحة مفاتيح؟
استخدم `code` عندما يكون الموضع الفعلي مهمًا، مثل حركة WASD في لعبة. استخدم `key` عندما يكون المعنى مهمًا، مثل Ctrl+S للحفظ، بحيث يتبع الاختصار تخطيط المستخدم الخاص.
لماذا keyCode مهجور لكنه لا يزال يعمل؟
إنه يسبق الأحداث المدركة للتخطيط ويعيد أرقامًا غير متسقة لعلامات الترقيم عبر المتصفحات. كل محرك ما زال يطبقه للتوافق، لكن المواصفات توجه الكود الجديد إلى `key` و`code`.
لا يحدث شيء عندما أضغط Ctrl+W أو Command+Q.
تلك التركيبات يطالب بها المتصفح أو نظام التشغيل وتُعالج قبل أن تصل إلى الصفحة. لا توجد طريقة موثوقة لاعتراضها من صفحة ويب عادية.
كيف أكتب اختصارًا واحدًا يعمل على macOS وWindows؟
اقبل أيًا من المعدِّلين الرئيسيين باختبار `event.metaKey || event.ctrlKey`. هذا يطابق Command على macOS وControl على Windows وLinux دون التفرع على وكيل المستخدم.
ماذا يعني الموقع 3؟
المفتاح على لوحة الأرقام. الموقعان 1 و2 يعنيان العضوين الأيسر والأيمن من زوج مكرر مثل Shift أو Control، و0 يعني مفتاحًا عاديًا بلا تكرار.
هل يمكنني استخدام هذا لبناء معالج إدخال نص؟
من الأفضل الاستماع إلى حدث `input`. أحداث المفاتيح تفوت التركيب من لوحات المفاتيح IME والإكمال التلقائي والعديد من لوحات المفاتيح الافتراضية المحمولة، وكلها يبلغ عنها `input` بشكل صحيح.