كيف تعمل
كيف تقرأ JoyCheck يد تحكمك
إن JoyCheck أداة اختبار يد تحكم تعمل في المتصفح وتقرأ ذراعك عبر W3C Gamepad API، دون تثبيت ودون إرسال أي شيء إلى خادم. مخطط تدفق بيانات مباشر مع أمثلة برمجية في الأسفل.

إن JoyCheck أداة اختبار يد تحكم تعمل في المتصفح وتقرأ ذراعك عبر W3C Gamepad API، دون تثبيت ودون إرسال أي شيء إلى خادم.
6 أنواع إدخال · 4 أقسام · 10 دقائق قراءة
تقرأ JoyCheck يد تحكمك باستخدام W3C Gamepad API[1]، وهي واجهة أصيلة داخل المتصفح تكشف كل زر ومحور تماثلي وزناد كقيم رقمية تُحدَّث 60 مرة في الثانية. يتولى المتصفح مصافحة USB أو Bluetooth؛ وتستعلم JoyCheck عن navigator.getGamepads() في كل إطار رسم وتعرض الحالة المباشرة دون إرسال بيانات إلى أي خادم.
◆ مُتحقَّق منه
تُعرّف مواصفة W3C Gamepad API نطاقات القيم التماثلية المُطبَّعة بأنها من -1.0 إلى +1.0، وتكشف كل يد تحكم موصولة لأي متصفح حديث عبر navigator.getGamepads()[1]. تقرأ JoyCheck تمامًا البيانات نفسها التي يكشفها متصفحك لأي تطبيق ويب آخر، دون مُثبِّت أو مُشغِّل تعريف أو طبقة قياس عن بُعد بينهما.
المصدر: مواصفة W3C Gamepad API
آخر تحديث: 2026-05-27، بقلم Taimoor Bamazai، مؤسس Elites Algorithm Limited (شركة تقنية مسجّلة في دبلن، أيرلندا) والمهندس وراء JoyCheck.
أبرز النقاط
- تقرأ JoyCheck أذرع التحكم عبر W3C Gamepad API، الواجهة الأصيلة داخل المتصفح نفسها التي تستخدمها كل لعبة حديثة.
- يستعلم المتصفح عن الأذرع بوتيرة إطار الرسم: 60 هرتز على الشاشات العادية، و120 إلى 144 هرتز على الشاشات عالية التحديث.
- تشترط Gamepad API إيماءة من المستخدم قبل كشف الأذرع، ولذلك يلزم ضغط زر لإيقاظ الصفحة.
- لا يقف بين يد التحكم والصفحة أي مُثبِّت أو مُشغِّل تعريف أو طبقة قياس عن بُعد؛ فالبيانات لا تغادر جهازك أبدًا.
- دعم المتصفح متسق عبر Chrome و Edge و Firefox و Brave و Vivaldi[4]؛ أما Safari فجزئي في اللمسيات.

يتميّز تدفق البيانات المباشر بثلاث خصائص تستحق التسمية:
- أصيل داخل المتصفح. واجهة W3C Gamepad API المعيارية. دون ملف تنفيذي أصيل، دون تثبيت مُشغِّل تعريف. يعمل في كل متصفح Chromium حديث، وفي Firefox، وفي Safari 16 فأحدث.
- استعلام بمعدل 60 إلى 144 هرتز. تقرأ JoyCheck واجهة navigator.getGamepads() في كل إطار رسم، بالمعدل نفسه الذي يعيد به المتصفح الرسم، مطابقًا لمعدل هرتز شاشتك.
- دون إرسال أي بيانات. كل مُدخَل يُعالَج داخل عملية متصفحك. دون XHR، دون fetch، دون تحليلات على الأداة. ويمكن التحقق من ذلك في DevTools.
ماذا يعني أن “تُقرأ” يد تحكم لعبة؟
تقرأ JoyCheck ستة أصناف من المدخلات من يد تحكمك، ويرتبط كل صنف بحقل محدد في Gamepad API.
- الأزرار (
gamepad.buttons[]). كل زر هو كائن GamepadButton يُبلّغ عن حالة ضغطه، وحيثما يُدعم ذلك، عن قيمة تماثلية. - العصي التماثلية (
gamepad.axes[0..3]). مصفوفة axes هي مصفوفة أعداد عشرية مسطّحة. وبحسب التخطيط المعياري من W3C تحمل مواضع X/Y للعصا اليسرى واليمنى. - الأزناد (
gamepad.buttons[6,7].value). تقع الأزناد ضمن مصفوفة buttons وتُعامَل كأزرار ذات قيمة تماثلية بحسب التخطيط المعياري. - لوحة اللمس (
gamepad.touchEvents[]). تكشف DualShock 4 وDualSense إحداثيات لوحة اللمس كامتداد لـ Gamepad API. تبلغ دقة لوحة اللمس المُبلَّغ عنها نحو 1920×1080، ويُتتبَّع ما يصل إلى نقطتَي لمس متزامنتين. - الجيروسكوب و IMU (
gamepad.imu، مقترح). تكشف DualSense و Joy-Con وSwitch Pro جميعها بيانات IMU سداسية المحاور. - الاهتزاز (
gamepad.vibrationActuator.playEffect()). تكشف واجهة vibrationActuator على كائن Gamepad دالة playEffect() تأخذ مدة وشدة لكل مُحرّك، وذلك على الأذرع المعيارية التي تُبلّغ عن مُحرّكات لمسية.
كيف تعمل W3C Gamepad API فعليًا؟
إن Gamepad API واجهة متصفح معيارية من W3C تكشف أذرع الألعاب الموصولة لـ JavaScript. وهي مشمولة في كل متصفح حديث منذ Chrome 21 (2012)، و Firefox 29 (2014)، و Edge 12 (2015)، و Safari 14.1 (2021)، راجع Can I Use لمصفوفة الدعم الحالية.[2]
يتولى المتصفح مصافحة USB أو Bluetooth HID الأساسية. يقرن نظام تشغيلك يد التحكم؛ ويراها المتصفح عبر طبقات مُشغّلات التعريف على مستوى النظام (XInput على Windows، و IOHIDDevice على macOS، و evdev على Linux)؛ ثم تستدعي الصفحة navigator.getGamepads() وتتلقى مصفوفة لقطة من كائنات Gamepad.
يكشف كل كائن Gamepad مجموعة من الحقول:
- id: مُعرِّف نصي (مثال “DualSense Wireless Controller (STANDARD GAMEPAD Vendor: 054c Product: 0ce6)”)
- axes[]: مصفوفة أعداد عشرية لمواضع المحاور التماثلية (العصي، عادةً أربعة مدخلات: يسار X/Y + يمين X/Y)
- buttons[]: مصفوفة من كائنات GamepadButton، لكل منها خصائص pressed و value و touched
- timestamp: وقت آخر تحديث بالمللي ثانية
- mapping: “standard” إذا كانت يد التحكم تطابق تخطيط W3C المعياري لأذرع اللعب؛ و"" فيما عدا ذلك
- vibrationActuator: واجهة تغذية راجعة لمسية (حيثما تُدعم)
تشترط الواجهة إيماءة من المستخدم (ضغط زر) قبل كشف الأذرع الموصولة. هذا هو شرط الإيماءة: ميزة خصوصية تمنع الصفحات من أخذ بصمة يد تحكمك في الخلفية. تعرض JoyCheck “اضغط أي زر للبدء” حتى تُطلَق الإيماءة.
لماذا تستعلم JoyCheck بدلًا من الاشتراك في الأحداث
إن Gamepad API قائمة على الاستعلام فقط في المواصفة. لا يوجد حدث onbuttonpress يمكنك الاشتراك فيه، بل يطلب كودك navigator.getGamepads() فيحصل على لقطة للحالة الراهنة. تستعلم JoyCheck باستخدام requestAnimationFrame[5]، الذي يُطلق ردّ النداء بمعدل تحديث شاشة العرض (عادةً 60 هرتز، وحتى 240 هرتز على الشاشات عالية التحديث).
الاستعلام بمعدل التحديث هو الوتيرة الصحيحة للأسباب التالية:
- يُحدّث نظام التشغيل حالة يد التحكم بنحو ذلك المعدل (يستعلم USB HID بمعدل 1 كيلوهرتز؛ والمتصفح يأخذ عينات أقل)
- يجري الرسم بمعدل التحديث، فأي استعلامات إضافية ستنتج إطارات مكررة دون أي فرق بصري
- يبقي استهلاك المعالج ضئيلًا، إذ يكون ردّ نداء الاستعلام استدعاء دالة واحدًا لكل إطار
الاستعلام الأسرع (عبر setInterval أو setTimeout) يهدر المعالج وينتج لقطات مكررة. والاستعلام الأبطأ (مثلًا 30 هرتز) يفوّت ضغطات الأزرار السريعة على الشاشات عالية التحديث. أما requestAnimationFrame فيطابق الشاشة، التي تطابق ما تراه فعليًا.
لماذا تخلو JoyCheck من إرسال البيانات وكيف يمكنني التحقق؟
نقولها ثلاث مرات لأنها تهمّ:
-
لا ترسل JoyCheck أي بيانات ليد تحكم إلى أي خادم، إطلاقًا.
-
تعمل Gamepad API بالكامل داخل عملية متصفحك. حالة يد التحكم لا تغادر الصفحة أبدًا.
-
اعرض مصدر الأداة: كل استدعاء للواجهة يؤول إلى ردّ نداء requestAnimationFrame يُحدّث عُقَد DOM فقط. لا توجد استدعاءات fetch()، ولا XMLHttpRequest، ولا أي مسّ لـ WebSocket يحمل بيانات يد التحكم.
يمكنك التحقق من ذلك بنفسك في أقل من دقيقة: افتح JoyCheck في أي متصفح، وافتح DevTools (F12)، وانقر تبويب الشبكة (Network)، وامسح السجل، وشغّل الأداة لمدة 30 ثانية. يبقى تبويب الشبكة فارغًا فيما يخص طلبات حالة يد التحكم. البيان الكامل على صفحة الخصوصية.
لماذا تستخدم أداة اختبار في المتصفح بدلًا من تطبيق سطح مكتب؟
ثلاثة أسباب:
دون احتكاك التثبيت. أصبحت Gamepad API الآن موثوقة بما يكفي لجعل مطالبة المستخدمين بتنزيل ملف تنفيذي وتشغيله عبئًا لا لزوم له. تحميل صفحة أسرع من مُثبِّت؛ والمتصفح أعمّ من توزيع ملف .exe الخاص بـ Windows وحده.
مجاني وعابر للمنصات. الصفحة نفسها تعمل على Windows و macOS و Linux و ChromeOS دون بُنى لكل منصة على حدة. أداة الاختبار في المتصفح تُطلَق مرة واحدة.
قابلة للتدقيق في 30 ثانية. نشاط الشبكة والتخزين لصفحة ويب قابلان للفحص عبر DevTools المتصفح من أي مستخدم في أي وقت. أما نشاط الشبكة لتطبيق سطح مكتب فيتطلب tcpdump أو Wireshark أو lsof وصلاحيات جذر. قابلية التدقيق تهمّ.
“على مدى سنوات من العمل في التشخيص العتادي لملحقات الحاسوب وأذرع الألعاب، التقطت أدوات الاختبار في المتصفح نحو ثلثَي الأعطال التي لم تكن أداة تشخيص على سطح المكتب لتُظهرها أبدًا. يقرأ المتصفح ما تُبلّغ عنه يد التحكم فيزيائيًا، وهذه طبقة حقيقة مختلفة عمّا يكشفه أي مُشغِّل تعريف قائم على مُثبِّت.”
Taimoor Bamazai، مؤسس، Elites Algorithm Limited
ما هي حدود JoyCheck المعروفة؟
قائمة صريحة بما لا تفعله JoyCheck:
-
دون وصول خام إلى HID. قراءة واصف USB HID الخام تتطلب WebHID، وهي مواصفة W3C منفصلة بدعم متصفح أقل اتساقًا (Chrome و Edge فقط، اليوم).
-
الأذرع السابقة لـ Gamepad API. الأذرع المقتصرة على DirectInput من زمن ما قبل وجود XInput لا تظهر في المتصفح. إذ تحتاج إلى WebHID مع طبقة ترجمة.
-
دعم الاهتزاز يتفاوت بحسب المتصفح. يتأخر Firefox عن Chrome في vibrationActuator؛ وفي Safari دعم محدود. تُبلّغ JoyCheck عن هذا القيد بلطف.
-
ضغط الأزناد على أذرع Xbox يعتمد على طبقة مُشغِّل التعريف. بعض إقرانات Bluetooth تُبلّغ عن أزناد ثنائية (تشغيل/إيقاف فقط، دون نطاق تماثلي). وعادةً يُصلح اتصال USB سلكي ذلك.
للمسارات التشخيصية الخاصة بكل منصة بما يتجاوز ما يستطيع المتصفح رؤيته، يغطي الدليل المخصص أنماط أعطال تحتاج إلى تدخل على جانب العتاد.
وللأدلة التشخيصية الخاصة بكل يد تحكم والتي تستخدم طبقة القراءة نفسها في المتصفح، يغطي دليل إقران Switch Pro Controller، ودليل معايرة DualSense، ودليل معايرة يد تحكم PS4 خصوصيات الإقران الخاصة بكل منصة والتي لا تستطيع Gamepad API وحدها حلّها.
المصادر والمراجع
-
مواصفة W3C Gamepad API. المعيار من W3C الذي يُعرّف نطاقات قيم العصا التماثلية المُطبَّعة (-1.0 إلى +1.0)، وواجهة الاستعلام، وشرط إيماءة المستخدم الذي يُطبّقه كل متصفح حديث لأذرع اللعب الموصولة.
-
MDN Web Docs: Gamepad API. مرجع المطورين من Mozilla الذي يغطي قراءة يد التحكم الأصيلة داخل المتصفح، ووتيرة الاستعلام بمعدل إطار الرسم، وامتداد Haptic Actuator[3] المستخدم لدعم الاهتزاز.
-
مرجع واجهة Gamepad Haptic Actuator (MDN). مرجع MDN لامتداد Haptic Actuator، ودعم مُصنّعي المتصفحات عبر أذرع DualSense و Xbox Series X|S و Switch Pro، والتغطية الجزئية في Safari.
-
مصفوفة دعم Gamepad API على caniuse.com. تفصيل دعم المتصفحات الحالي عبر Chrome و Edge و Firefox و Brave و Vivaldi و Safari و iOS Safari، بما في ذلك الإصدار الذي أصبحت فيه اللمسيات متاحة.
-
دليل web.dev لواجهة Gamepad API. مرجع منصة الويب من Google الذي يغطي أحداث الاتصال، وأنماط الاستعلام، والتكامل الموصى به مع requestAnimationFrame الذي تستخدمه JoyCheck داخليًا.
ملاحظات JoyCheck حول معدل الاستعلام (مقيسة 2026-05)
تحدّ المتصفحات قراءة Gamepad API عند وتيرة requestAnimationFrame. في تحليلنا قِسنا الأذرع نفسها تحت ظروف عرض متطابقة. جميع القراءات: جلسة Chrome 120 جديدة، اتصال USB ما لم يُذكر خلاف ذلك، نافذة منزلقة مدتها 5 ثوانٍ.
| يد التحكم | معدل الاستعلام العتادي الأصلي | القراءة المرصودة في JoyCheck (شاشة 60 هرتز) | ملاحظات |
|---|---|---|---|
| PS5 DualSense (USB) | 250 هرتز | 59، 60 هرتز | محدود بـ rAF |
| PS5 DualSense (Bluetooth) | 250 هرتز | 59، 60 هرتز | محدود بـ rAF |
| Xbox Series controller (USB) | 125 هرتز | 59، 60 هرتز | محدود بـ rAF |
| 8BitDo Pro 2 (Bluetooth) | 125 هرتز | 59، 60 هرتز | محدود بـ rAF |
| Switch Pro Controller (Bluetooth) | 200 هرتز | 59، 60 هرتز | محدود بـ rAF |
| Logitech G29 (USB) | 100 هرتز | 59، 60 هرتز | محدود بـ rAF |
مقيسة بأخذ العينات داخل متصفح JoyCheck. ترفع شاشات 144 هرتز الحدّ تناسبيًا؛ والقراءات مُطبَّعة إلى خط أساس 60 هرتز للمقارنة بين المتصفحات.
أسئلة شائعة حول كيفية عمل JoyCheck
ما هي Gamepad API؟
إن W3C Gamepad API هي واجهة أصيلة داخل المتصفح تتيح لـ JavaScript قراءة أذرع التحكم الموصولة عبر USB و Bluetooth. تكشف كل زر كحالة ضغط قيمتها 0 أو 1، وكل عصا تماثلية كإحداثيات X/Y من -1.0 إلى 1.0، والأزناد كقيم ضغط تماثلية من 0.0 إلى 1.0. متوفرة في Chrome و Edge و Firefox و Safari 14.1 فأحدث.
هل تحتاج JoyCheck إلى إذن لقراءة يد تحكمي؟
لا تُطلب أي أذونات على مستوى النظام، لكن المتصفح يشترط إيماءة من المستخدم (أي ضغطة زر على يد التحكم) قبل كشف حالتها. هذه ميزة للخصوصية وتوفير الطاقة في مواصفة Gamepad API، وليست قيدًا في JoyCheck.
كم مرة تقرأ JoyCheck يد تحكمي؟
تستعلم JoyCheck عن navigator.getGamepads() في كل إطار رسم عبر requestAnimationFrame. وهذا يطابق معدل تحديث شاشتك: 60 هرتز على شاشة عادية، و120 أو 144 هرتز على شاشة عالية التحديث. قد يستعلم العتاد أسرع لكن المتصفح لا يستطيع كشف ذلك لـ JavaScript.
لماذا لا تظهر يد تحكمي إلا بعد أن أضغط زرًا؟
بحسب المواصفة، تُخفي Gamepad API أذرع التحكم الموصولة حتى يُدخل المستخدم أمرًا. يمنع هذا البصمة السلبية ويقلّل استهلاك المعالج في الخلفية. اضغط أي زر لإيقاظ الواجهة؛ عندها تصبح يد التحكم مرئية لـ JoyCheck خلال إطار رسم واحد.
هل تستطيع JoyCheck قراءة لوحة المفاتيح والفأرة؟
فقط عبر تبويب لوحة المفاتيح، إذ يمر إدخال لوحة المفاتيح عبر واجهة KeyboardEvent المعيارية، وليس عبر Gamepad API. أما إدخال الفأرة فليس ضمن نطاق JoyCheck.
هل يعمل هذا على أجهزة Chromebook؟
نعم. يدعم ChromeOS واجهة Gamepad API في Chrome (وفي أي متصفح مبني على Chromium يُثبَّت عبر Play Store).
لماذا لا تُبلّغ كل الأذرع عن الاهتزاز؟
إن امتداد Gamepad Haptics يعتمد على المتصفح وعلى يد التحكم. تدعمه Chrome و Edge و Firefox لأغلب الأذرع الحديثة (DualSense و Xbox Series X|S و Switch Pro). أما دعم Safari فجزئي. وبعض الأذرع الأقدم لا تُبلّغ عن أي مُحرّكات لمسية إطلاقًا.