ระบบโฟกัสจะติดตามตำแหน่ง (โฟกัส) ของผู้ใช้ในโปรแกรมแก้ไข Blockly Blockly และโค้ดที่กำหนดเองใช้แอตทริบิวต์นี้เพื่อระบุว่าคอมโพเนนต์ใด (บล็อก ฟิลด์ หมวดหมู่กล่องเครื่องมือ ฯลฯ) กำลังโฟกัสอยู่ และเพื่อย้ายโฟกัสไปยังคอมโพเนนต์อื่น
คุณควรทําความเข้าใจระบบโฟกัสเพื่อให้แน่ใจว่าโค้ดที่กําหนดเองทํางานได้อย่างถูกต้อง
สถาปัตยกรรม
ระบบโฟกัสมี 3 ส่วน ได้แก่
FocusManager
เป็น Singleton ที่ประสานงานโฟกัสใน Blockly ทั้งหมด Blockly และโค้ดที่กำหนดเองใช้เพื่อค้นหาว่าคอมโพเนนต์ใด มีโฟกัสของ Blockly รวมถึงย้ายโฟกัสของ Blockly ไปยังคอมโพเนนต์อื่น นอกจากนี้ ยังรอรับเหตุการณ์โฟกัส DOM, ซิงค์โฟกัส Blockly และโฟกัส DOM รวมถึงจัดการคลาส CSS ที่ระบุคอมโพเนนต์ที่มี โฟกัสBlockly ใช้ Focus Manager เป็นหลัก บางครั้งโค้ดที่กำหนดเองจะใช้เพื่อโต้ตอบกับระบบโฟกัส
IFocusableTree
คือพื้นที่อิสระของโปรแกรมแก้ไข Blockly เช่น พื้นที่ทํางานหรือกล่องเครื่องมือ ประกอบด้วยโหนดที่โฟกัสได้ เช่น บล็อกและ ฟิลด์ นอกจากนี้ ต้นไม้ยังมีกิ่งก้านได้ด้วย เช่น พื้นที่ทำงานของ Mutator ใน บล็อกในพื้นที่ทำงานหลักคือ Subtree ของพื้นที่ทำงานหลักIFocusableTree
ใช้โดย Focus Manager เป็นหลัก คุณอาจไม่จำเป็นต้องติดตั้งใช้งานเว้นแต่จะเขียนกล่องเครื่องมือที่กำหนดเองIFocusableNode
คือคอมโพเนนต์ Blockly ที่สามารถมีโฟกัสได้ เช่น บล็อก ฟิลด์ หรือหมวดหมู่กล่องเครื่องมือ โหนดที่โฟกัสได้มีองค์ประกอบ DOM ที่ แสดงโหนดและมีโฟกัส DOM เมื่อโหนดมีโฟกัส Blockly โปรดทราบว่าทรียังเป็นโหนดที่โฟกัสได้ด้วย เช่น คุณสามารถมุ่งเน้นไปที่พื้นที่ทำงานโดยรวมได้โดยปกติแล้วโฟกัสแมเนเจอร์จะเป็นผู้เรียกใช้เมธอดใน
IFocusableNode
IFocusableNode
เองใช้เพื่อแสดงคอมโพเนนต์ที่มีโฟกัส เช่น เมื่อผู้ใช้เลือกรายการในเมนูตามบริบทของบล็อก ระบบจะส่ง บล็อกไปยังฟังก์ชันเรียกกลับของรายการเป็นIFocusableNode
หากเขียนคอมโพเนนต์ที่กำหนดเอง คุณอาจต้องติดตั้งใช้งาน
IFocusableNode
ประเภทโฟกัส
ระบบโฟกัสจะกำหนดโฟกัสประเภทต่างๆ
โฟกัส Blockly และโฟกัส DOM
โฟกัสมี 2 ประเภทหลักๆ ได้แก่ โฟกัส Blockly และโฟกัส DOM
โฟกัส Blockly ระบุคอมโพเนนต์ Blockly (บล็อก ฟิลด์ กล่องเครื่องมือ หมวดหมู่ ฯลฯ) ที่มีโฟกัส ซึ่งจำเป็นสำหรับการทำงานในระดับคอมโพเนนต์ Blockly ตัวอย่างเช่น ปลั๊กอินการนำทางด้วยแป้นพิมพ์ช่วยให้ผู้ใช้ ใช้แป้นลูกศรเพื่อย้ายจากคอมโพเนนต์หนึ่งไปยังอีกคอมโพเนนต์หนึ่งได้ เช่น จากบล็อก ไปยังฟิลด์ ในทำนองเดียวกัน ระบบเมนูตามบริบทจะสร้างเมนูที่ เหมาะสมกับคอมโพเนนต์ปัจจุบัน นั่นคือจะสร้างเมนูที่แตกต่างกัน สำหรับพื้นที่ทำงาน บล็อก และความคิดเห็นในพื้นที่ทำงาน
โฟกัส DOM ระบุองค์ประกอบ DOM ที่มีโฟกัส จำเป็นสำหรับการ ทำงานที่ระดับองค์ประกอบ DOM เช่น โปรแกรมอ่านหน้าจอจะ แสดงข้อมูลเกี่ยวกับองค์ประกอบที่ปัจจุบันมีโฟกัส DOM และแท็บจะ ย้าย (เปลี่ยนโฟกัส) จากองค์ประกอบ DOM ไปยังองค์ประกอบ DOM
Focus Manager จะซิงค์โฟกัสของ Blockly และโฟกัสของ DOM ไว้ด้วยกัน ดังนั้นเมื่อโหนด (คอมโพเนนต์ Blockly) มีโฟกัสของ Blockly องค์ประกอบ DOM พื้นฐานของโหนดนั้นจะมีโฟกัสของ DOM และในทางกลับกัน
การโฟกัสแบบแอ็กทีฟและแบบพาสซีฟ
โฟกัส Blockly จะแบ่งออกเป็นโฟกัสที่ใช้งานอยู่และโฟกัสแบบพาสซีฟ โฟกัสที่ใช้งานอยู่หมายความว่าโหนดจะรับอินพุตของผู้ใช้ เช่น การกดแป้น โฟกัสแบบพาสซีฟหมายความว่าโหนดเคยมีโฟกัสที่ใช้งานอยู่ แต่สูญเสียไปเมื่อผู้ใช้ย้ายไปยังโหนดในโครงสร้างอีกโครงสร้างหนึ่ง (เช่น ย้ายจากพื้นที่ทำงานไปยังกล่องเครื่องมือ) หรือออกจากโปรแกรมแก้ไข Blockly โดยสิ้นเชิง หาก ทรีกลับมาโฟกัสอีกครั้ง โหนดที่โฟกัสแบบพาสซีฟจะกลับมาโฟกัสแบบแอ็กทีฟ
แต่ละทรีมีบริบทโฟกัสแยกกัน กล่าวคือ โหนดในแผนผังมีโฟกัสได้มากที่สุด 1 โหนด การโฟกัสจะใช้งานอยู่หรือไม่ได้ใช้งานขึ้นอยู่กับว่า ทรีมีการโฟกัสหรือไม่ มีโหนดที่มีโฟกัสที่ใช้งานอยู่ได้สูงสุด 1 รายการในทั้งหน้า
Focus Manager ใช้ไฮไลต์ (คลาส CSS) ที่แตกต่างกันสำหรับโหนดที่โฟกัสอยู่และ โหนดที่ไม่ได้โฟกัส ซึ่งจะช่วยให้ผู้ใช้ทราบว่าตนเองอยู่ที่ใดและ จะกลับไปที่ใด
โฟกัสชั่วคราว
โฟกัสอีกประเภทหนึ่งเรียกว่าโฟกัสชั่วคราว เวิร์กโฟลว์ที่แยกกัน เช่น กล่องโต้ตอบหรือเอดิเตอร์ฟิลด์ จะขอโฟกัสชั่วคราวจากโฟกัส แมเนเจอร์ เมื่อ Focus Manager ให้โฟกัสชั่วคราว ระบบจะระงับโฟกัส ในทางปฏิบัติแล้ว เวิร์กโฟลว์ดังกล่าวจะบันทึกและดำเนินการกับเหตุการณ์โฟกัส DOM ได้โดยไม่ต้องกังวลว่าระบบโฟกัสอาจดำเนินการกับเหตุการณ์เหล่านั้นด้วย
เมื่อ Focus Manager ให้โฟกัสชั่วคราว ระบบจะเปลี่ยนโหนดที่โฟกัสอยู่ เป็นโฟกัสแบบพาสซีฟ ซึ่งจะกู้คืนโฟกัสที่ใช้งานอยู่เมื่อมีการส่งคืนโฟกัสชั่วคราว
ตัวอย่าง
ตัวอย่างต่อไปนี้จะแสดงวิธีที่ Blockly ใช้ระบบโฟกัส ซึ่งจะช่วยให้คุณเข้าใจว่าโค้ดของคุณเข้ากับระบบโฟกัสได้อย่างไรและโค้ดของคุณอาจใช้ระบบโฟกัสอย่างไร
ย้ายโฟกัสด้วยแป้นพิมพ์
สมมติว่าบล็อกที่มี 2 ฟิลด์มีโฟกัส Blockly ดังที่ระบุโดยการไฮไลต์ (คลาส CSS) ในองค์ประกอบ DOM ของบล็อก ตอนนี้สมมติว่าผู้ใช้กดลูกศรขวา
- ปลั๊กอินการนำทางด้วยแป้นพิมพ์
- รับเหตุการณ์การกดแป้น
- ขอให้ระบบนำทาง (ส่วนหนึ่งของ Blockly หลัก) ย้ายโฟกัสไปยังคอมโพเนนต์ "ถัดไป"
- ระบบนำทางมีลักษณะดังนี้
- ถาม Focus Manager ว่าคอมโพเนนต์ใดมีโฟกัสของ Blockly Focus
manager จะแสดงผลบล็อกเป็น
IFocusableNode
- กำหนดว่า
IFocusableNode
เป็นBlockSvg
และดู กฎสำหรับการไปยังส่วนต่างๆ ของบล็อก ซึ่งระบุว่าควรย้ายโฟกัส Blockly จากบล็อกทั้งบล็อกไปยังช่องแรกในบล็อก - บอกให้ Focus Manager ย้ายโฟกัส Blockly ไปยังช่องแรก
- ถาม Focus Manager ว่าคอมโพเนนต์ใดมีโฟกัสของ Blockly Focus
manager จะแสดงผลบล็อกเป็น
- ผู้จัดการโฟกัส
- อัปเดตสถานะเพื่อตั้งค่าโฟกัส Blockly ในช่องแรก
- ตั้งค่าโฟกัส DOM ในองค์ประกอบ DOM ของฟิลด์
- ย้ายคลาสไฮไลต์จากองค์ประกอบของบล็อกไปยังองค์ประกอบของฟิลด์
ย้ายโฟกัสด้วยเมาส์
ตอนนี้สมมติว่าผู้ใช้คลิกช่องที่ 2 ในบล็อก โฟกัส ผู้จัดการ:
- รับเหตุการณ์ DOM
focusout
ในองค์ประกอบ DOM ของช่องแรกและเหตุการณ์focusin
ในองค์ประกอบ DOM ของช่องที่สอง - กำหนดว่าองค์ประกอบ DOM ที่ได้รับโฟกัสสอดคล้องกับช่องที่ 2
- อัปเดตสถานะเพื่อตั้งค่าโฟกัส Blockly ในช่องที่ 2 (Focus Manager ไม่จำเป็นต้องตั้งค่าโฟกัส DOM เนื่องจากเบราว์เซอร์ได้ดำเนินการนี้แล้ว)
- ย้ายคลาสไฮไลต์จากองค์ประกอบของช่องแรกไปยังองค์ประกอบของช่องที่สอง
ตัวอย่างอื่นๆ
ตัวอย่างอื่นๆ มีดังนี้
เมื่อผู้ใช้ลากบล็อกจากกล่องเครื่องมือไปยังพื้นที่ทํางาน ตัวแฮนเดิลเหตุการณ์ของเมาส์ จะสร้างบล็อกใหม่และเรียกใช้ตัวจัดการโฟกัสเพื่อตั้งค่าโฟกัสของ Blockly ในบล็อกนั้น
เมื่อลบบล็อก เมธอด
dispose
จะเรียกตัวจัดการโฟกัสเพื่อ ย้ายโฟกัสไปยังบล็อกระดับบนสุดแป้นพิมพ์ลัดใช้
IFocusableNode
เพื่อระบุคอมโพเนนต์ Blockly ที่แป้นพิมพ์ลัด ใช้เมนูตามบริบทใช้
IFocusableNode
เพื่อระบุคอมโพเนนต์ Blockly ที่เรียกใช้เมนู
การปรับแต่งและระบบโฟกัส
เมื่อปรับแต่ง Blockly คุณต้องตรวจสอบว่าโค้ดทำงานได้อย่างถูกต้อง กับระบบโฟกัส นอกจากนี้ คุณยังใช้ระบบโฟกัสเพื่อระบุและตั้งค่า โหนดที่โฟกัสในปัจจุบันได้ด้วย
บล็อกที่กำหนดเองและเนื้อหาของกล่องเครื่องมือ
วิธีที่ใช้กันมากที่สุดในการปรับแต่ง Blockly คือการกำหนดบล็อกที่กำหนดเองและ ปรับแต่งเนื้อหาของกล่องเครื่องมือ การดำเนินการทั้ง 2 อย่างนี้ไม่มีผลต่อระบบโฟกัส
คลาสที่กำหนดเอง
คลาสที่กำหนดเองอาจต้องใช้โฟกัสอินเทอร์เฟซอย่างใดอย่างหนึ่งหรือทั้ง 2 อย่าง
(IFocusableTree
และ IFocusableNode
) ซึ่งอาจไม่ชัดเจนเสมอไป
บางคลาสจำเป็นต้องใช้โฟกัสอินเทอร์เฟซอย่างชัดเจน ซึ่งได้แก่
คลาสที่ใช้กล่องเครื่องมือที่กำหนดเอง คลาสนี้ต้องใช้
IFocusableTree
และIFocusableNode
คลาสที่สร้างคอมโพเนนต์ที่มองเห็นได้ (เช่น ฟิลด์หรือไอคอน) ซึ่งผู้ใช้ ไปยังส่วนต่างๆ ได้ คลาสเหล่านี้ต้องใช้
IFocusableNode
บางคลาสต้องใช้ IFocusableNode
แม้ว่าจะไม่ได้สร้างคอมโพเนนต์ที่มองเห็นได้หรือสร้างคอมโพเนนต์ที่มองเห็นได้ซึ่งผู้ใช้ไปยังส่วนต่างๆ ไม่ได้ก็ตาม ซึ่งได้แก่
คลาสที่ใช้การติดตั้งอินเทอร์เฟซที่ขยาย
IFocusableNode
เช่น ไอคอนย้ายในปลั๊กอินการนำทางด้วยแป้นพิมพ์จะแสดง ลูกศรสี่ทิศที่บ่งบอกว่าย้ายบล็อกได้ด้วยปุ่มลูกศร ผู้ใช้จะไม่เห็นไอคอน (ลูกศรสี่ทิศเป็นบับเบิล) และ ไม่สามารถไปยังไอคอนดังกล่าวได้ อย่างไรก็ตาม ไอคอนต้องใช้
IFocusableNode
เนื่องจากไอคอนใช้IIcon
และIIcon
ขยายIFocusableNode
คลาสที่ใช้ใน API ที่ต้องมี
IFocusableNode
เช่น คลาส
FlyoutSeparator
จะสร้างช่องว่างระหว่าง 2 รายการใน เมนูแบบลอย โดยจะไม่สร้างองค์ประกอบ DOM ใดๆ จึงไม่มีคอมโพเนนต์ที่มองเห็นได้ และผู้ใช้จะไปยังส่วนนี้ไม่ได้ อย่างไรก็ตาม ต้องใช้IFocusableNode
เนื่องจากจัดเก็บไว้ในFlyoutItem
และเครื่องมือสร้างFlyoutItem
ต้องใช้IFocusableNode
คลาสที่ขยายคลาสที่ใช้
IFocusableNode
เช่น
ToolboxSeparator
ขยายToolboxItem
ซึ่งใช้IFocusableNode
แม้ว่าตัวคั่นกล่องเครื่องมือจะมีคอมโพเนนต์ที่มองเห็นได้ แต่ผู้ใช้จะไปยังตัวคั่นเหล่านั้นไม่ได้เนื่องจากไม่สามารถดำเนินการใดๆ กับตัวคั่นได้และไม่มี เนื้อหาที่เป็นประโยชน์
คลาสอื่นๆ จะสร้างคอมโพเนนต์ที่มองเห็นได้ซึ่งผู้ใช้ไปยังได้ แต่ไม่จำเป็นต้องใช้ IFocusableNode
ซึ่งได้แก่
- คลาสที่สร้างคอมโพเนนต์ที่มองเห็นได้ซึ่งจัดการโฟกัสของตัวเอง เช่น
เอดิเตอร์ฟิลด์หรือกล่องโต้ตอบ (โปรดทราบว่าคลาสเหล่านี้ต้องใช้โฟกัสชั่วคราวเมื่อเริ่มและส่งคืนเมื่อสิ้นสุด การใช้
WidgetDiv
หรือDropDownDiv
จะจัดการให้คุณ)
สุดท้ายนี้ คลาสบางคลาสไม่ได้โต้ตอบกับระบบโฟกัสและไม่จำเป็นต้องใช้ IFocusableTree
หรือ IFocusableNode
ซึ่งได้แก่
คลาสที่สร้างคอมโพเนนต์ที่มองเห็นได้ซึ่งผู้ใช้ไม่สามารถไปยังส่วนต่างๆ หรือดำเนินการ ได้ และไม่มีข้อมูลที่โปรแกรมอ่านหน้าจออาจใช้ เช่น พื้นหลังที่ใช้ตกแต่งในเกม
คลาสที่ไม่เกี่ยวข้องกับระบบโฟกัสเลย เช่น คลาสที่ใช้
IMetricsManager
หรือIVariableMap
หากไม่แน่ใจว่าชั้นเรียนของคุณจะโต้ตอบกับระบบโฟกัสหรือไม่
ให้ทดสอบด้วยปลั๊กอินการไปยังส่วนต่างๆ ด้วยแป้นพิมพ์ หากไม่สำเร็จ คุณอาจต้อง
ใช้ IFocusableTree
หรือ IFocusableNode
หากสำเร็จแต่คุณยังไม่แน่ใจ
ให้อ่านโค้ดที่ใช้คลาสของคุณเพื่อดูว่าต้องใช้อินเทอร์เฟซใด
หรือมีการโต้ตอบอื่นๆ หรือไม่
ใช้โฟกัสอินเทอร์เฟซ
วิธีที่ง่ายที่สุดในการใช้งาน IFocusableTree
หรือ IFocusableNode
คือการขยายคลาสที่ใช้การเชื่อมต่อเหล่านี้ เช่น หากคุณกำลังสร้างกล่องเครื่องมือที่กำหนดเอง ให้ขยาย Toolbox
ซึ่งใช้ IFocusableTree
และ IFocusableNode
หากคุณกำลังสร้างช่องที่กำหนดเอง ให้ขยาย Field
ซึ่ง
ใช้ IFocusableNode
โปรดตรวจสอบว่าโค้ดของคุณไม่รบกวน
โค้ดอินเทอร์เฟซโฟกัสในคลาสฐาน
หากขยายคลาสที่ใช้โฟกัสอินเทอร์เฟซ คุณมักจะไม่ต้อง
ลบล้างเมธอดใดๆ ข้อยกเว้นที่พบบ่อยที่สุดคือ
IFocusableNode.canBeFocused
ซึ่งคุณต้องลบล้างหากไม่ต้องการให้
ผู้ใช้ไปยังคอมโพเนนต์ของคุณ
กรณีที่ต้องลบล้างเมธอดเรียกกลับโฟกัส (onTreeFocus
และ onTreeBlur
ใน IFocusableTree
และ onNodeFocus
และ onNodeBlur
ใน
IFocusableNode
) นั้นพบได้น้อยกว่า โปรดทราบว่าการพยายามเปลี่ยนโฟกัส (เรียก FocusManager.focusNode
หรือ FocusManager.focusTree
) จากเมธอดเหล่านี้จะทำให้เกิดข้อยกเว้น
หากเขียนคอมโพเนนต์ที่กำหนดเองตั้งแต่ต้น คุณจะต้องใช้โฟกัส
อินเทอร์เฟซด้วยตนเอง ดูข้อมูลเพิ่มเติมในเอกสารอ้างอิงสำหรับ
IFocusableTree
และ
IFocusableNode
หลังจากที่ได้ใช้คลาสแล้ว ให้ทดสอบกับปลั๊กอินการไปยังส่วนต่างๆ ด้วยแป้นพิมพ์เพื่อยืนยันว่าคุณไปยังคอมโพเนนต์ได้ (หรือไม่)
ใช้ตัวจัดการโฟกัส
คลาสที่กำหนดเองบางคลาสใช้ Focus Manager เหตุผลที่พบบ่อยที่สุดในการทำเช่นนี้
คือการรับโหนดที่โฟกัสอยู่ในปัจจุบันและโฟกัสที่โหนดอื่น หากต้องการรับ
ผู้จัดการลูกค้า ให้โทรหา Blockly.getFocusManager
const focusManager = Blockly.getFocusManager();
หากต้องการรับโหนดที่โฟกัสอยู่ในปัจจุบัน ให้เรียกใช้ getFocusedNode
const focusedNode = focusManager.getFocusedNode();
// Do something with the focused node.
หากต้องการย้ายโฟกัสไปยังโหนดอื่น ให้เรียกใช้ focusNode
// Move focus to a different block.
focusManager.focusNode(myOtherBlock);
หากต้องการย้ายโฟกัสไปยังแผนผัง ให้เรียกใช้ focusTree
การดำเนินการนี้ยังตั้งค่าโฟกัสของโหนดเป็นโหนดรูทของ
ทรีด้วย
// Move focus to the main workspace.
focusManager.focusTree(myMainWorkspace);
เหตุผลที่พบบ่อยอีกอย่างในการใช้ Focus Manager คือการรับและส่งคืนโฟกัสชั่วคราว ฟังก์ชัน takeEphemeralFocus
จะแสดงผล Lambda ที่คุณต้องเรียกใช้เพื่อ
แสดงผลโฟกัสชั่วคราว
const returnEphemeralFocus = focusManager.takeEphemeralFocus();
// Do something.
returnEphemeralFocus();
หากคุณใช้
WidgetDiv
หรือ
DropDownDiv
ระบบจะจัดการโฟกัสชั่วคราวให้คุณ
แท็บหยุด
ระบบโฟกัสจะตั้งแท็บหยุด (tabindex
ของ 0
) ในองค์ประกอบรูทของ
ทุกทรี (พื้นที่ทำงานหลัก กล่องเครื่องมือ และพื้นที่ทำงานแบบฟลายเอาต์) ซึ่งช่วยให้ผู้ใช้ใช้ปุ่ม Tab เพื่อไปยังส่วนต่างๆ ในพื้นที่หลักของโปรแกรมแก้ไข Blockly
แล้วใช้ปุ่มลูกศรเพื่อไปยังส่วนต่างๆ
ภายในพื้นที่เหล่านั้น (โดยใช้ปลั๊กอินการไปยังส่วนต่างๆ ด้วยแป้นพิมพ์) อย่าเปลี่ยนการหยุดแท็บเหล่านี้ เนื่องจากจะรบกวนความสามารถของตัวจัดการโฟกัสในการจัดการ
โดยทั่วไปแล้ว คุณควรหลีกเลี่ยงการตั้งค่าหยุดแท็บในองค์ประกอบ DOM อื่นๆ ที่ Blockly ใช้ เนื่องจากจะรบกวนโมเดลของ Blockly ในการใช้ปุ่ม Tab เพื่อ ไปยังส่วนต่างๆ ของเอดิเตอร์และปุ่มลูกศรภายในส่วนเหล่านั้น นอกจากนี้ แท็บหยุดดังกล่าวอาจไม่ทำงานตามที่ต้องการ เนื่องจากแต่ละ โฟกัสได้จะประกาศองค์ประกอบ DOM เป็นองค์ประกอบที่โฟกัสได้ หากคุณตั้งค่าแท็บ หยุดในองค์ประกอบย่อยขององค์ประกอบที่โฟกัสได้ และผู้ใช้กด Tab ไปยังองค์ประกอบนั้น Focus Manager จะย้ายโฟกัส DOM ไปยังองค์ประกอบที่โฟกัสได้ที่ประกาศไว้
คุณตั้งค่าการหยุดแท็บในองค์ประกอบในแอปพลิเคชันที่อยู่นอกเอดิเตอร์ Blockly ได้อย่างปลอดภัย เมื่อผู้ใช้กด Tab จากเอดิเตอร์ไปยังองค์ประกอบดังกล่าว Focus
Manager จะเปลี่ยนโฟกัส Blockly จาก "ใช้งานอยู่" เป็น "ไม่ได้ใช้งาน" เพื่อการช่วยเหลือพิเศษ คุณควรตั้งค่าพร็อพเพอร์ตี้ tabindex
เป็น 0
หรือ -1
ตามที่คำเตือนแนะนำไว้ในคำอธิบายของ tabindex
แอตทริบิวต์ใน MDN
โฟกัส DOM
ด้วยเหตุผลด้านการช่วยเหลือพิเศษ แอปพลิเคชันควรหลีกเลี่ยงการเรียกใช้เมธอด focus
ในองค์ประกอบ DOM ซึ่งทำให้ผู้ใช้โปรแกรมอ่านหน้าจอเกิดความสับสนเนื่องจากระบบจะ
ย้ายผู้ใช้ไปยังตำแหน่งที่ไม่รู้จักในแอปพลิเคชันโดยฉับพลัน
ปัญหาเพิ่มเติมคือตัวจัดการโฟกัสจะตอบสนองต่อเหตุการณ์โฟกัสโดย
ตั้งค่าโฟกัส DOM ให้กับบรรพบุรุษที่ใกล้ที่สุดหรือตัวขององค์ประกอบที่โฟกัสซึ่งเป็น
องค์ประกอบที่ประกาศว่าโฟกัสได้ ซึ่งอาจแตกต่างจากองค์ประกอบที่เรียกใช้
focus
(หากไม่มีบรรพบุรุษที่โฟกัสได้ที่ใกล้ที่สุดหรือตัวมันเอง เช่น เมื่อเรียกใช้ focus
ในองค์ประกอบนอกโปรแกรมแก้ไข Blockly ตัวจัดการโฟกัสจะเปลี่ยนโหนดที่โฟกัสอยู่เป็นโฟกัสแบบพาสซีฟ)
Positionables
Positionable คือคอมโพเนนต์ที่วางอยู่ด้านบนของพื้นที่ทำงานและ
ใช้IPositionable
ตัวอย่างเช่น ถังขยะและกระเป๋าเป้ในปลั๊กอิน
กระเป๋าเป้
ยังไม่ได้ผสานรวมองค์ประกอบที่จัดตำแหน่งได้เข้ากับระบบโฟกัส