Skip to content

الأحداث واختبار الإصابة

فصل الالتقاط عن اختبار الإصابة

يستمع الخيط الرئيسي إلى pointer وwheel وtouch بالخيار { passive: true }. أمّا الأحداث المتعلّقة بالتمرير فهي تكتفي بكتابة الفرق والطابع الزمني في قناة مشتركة: لا اختبار إصابة ولا setState.

يجري اختبار الإصابة في النواة: شجرة BVH فوق صناديق AABB في إحداثيات العالم تُصان تزايديًا مع الـ Scene (تُعاد بناؤها عند تغيّر البنية، ويُكتفى بإعادة الملاءمة عند تغيّر الهندسة وحدها). وبعد الإصابة يُبنى المسار من الجذر إلى الهدف ويُعاد إلى الغلاف عبر التدفّق العكسي.

وتضمن اختبارات الخصائص تطابق نتيجة BVH مع تنفيذ خطّي ساذج، فالمسار المحسَّن يملك دائمًا أوراكل يقارَن به.

الانتشار بثلاث مراحل

نموذج الأحداث موائم لـ DOM: التقاط ← هدف ← تصاعد.

tsx
<container onClickCapture={(event) => log("outer capture", event.eventPhase)}>
  <container
    onPointerDown={(event) => {
      event.preventDefault();
      event.stopPropagation();
    }}
  />
</container>

المعالِجات المتاحة: onPointerDown وonPointerUp وonPointerMove وonPointerCancel وonClick وonWheel، ولكلٍّ منها نسخة *Capture.

ويوفّر DoperEvent الحقول target وcurrentTarget وeventPhase والإحداثيات المنطقية المحلّية للـ canvas ‏x/y، وdeltaX/deltaY وbuttons ومفاتيح التعديل، إضافةً إلى preventDefault() وstopPropagation() وstopImmediatePropagation().

مشكلة توقيت preventDefault

لا يستطيع المستمع السلبي استدعاء preventDefault(). وهذه نقطة صحّة يجب معالجتها صراحةً لا تفصيلًا يمكن التحايل عليه.

والحلّ: تحسب النواة مسبقًا المناطق التي يجب أن تمنع السلوك الافتراضي (مثل منطقة تمرير داخلية)، وتزامن إلى الخيط الرئيسي «مستطيلات المناطق غير السلبية». فيحوّل الخيط الرئيسي تلك المناطق إلى مستمعين غير سلبيين ويستدعي preventDefault() تزامنيًا عند وقوع الحدث داخلها. وبذلك لا وجود لسباق يعتمد على ردّ لامتزامن.

حدود دلالة الإصابة

الدلالة الحالية مضيَّقة عمدًا تجنّبًا للسلوك الضمني:

  • عند تراكب الإصابات يكون الهدف «آخر ما رُسم». ولا يوجد حاليًا ترتيب z، ولا تعطيل الإصابة عبر pointer-events، ولا تخطّي العقد غير المرئية؛ وإدخال أيٍّ منها يستلزم قرار تصميم صريحًا.
  • الإصابة على لقطة الإطار: تُحسم كلّ أحداث الدفعة الواحدة مقابل هندسة آخر إطار مُودَع. وإن غيّر تمريرٌ داخل الدفعة الهندسةَ فلن يؤثّر ذلك في الإصابة إلّا في الإطار التالي، وهو ما يضمن دلالة التراجع الذرّي للدفعة وإعادة التشغيل الحتمية.
  • ويمرّ إدخال لوحة المفاتيح عبر بروتوكول إدخال التحرير ولا يتنكّر في هيئة حدث إصابة.

يمكنك متابعة سجلّ الانتشار الثلاثي لحظيًا في عرض الأحداث داخل Playground.

منشور برخصة MIT