Tôi muốn triển khai tiện ích hộp danh sách bằng cách sử dụng thông số thành phần web hiện tại. Hơn nữa, hộp danh sách kết quả phải phù hợp với tiêu chuẩn ARIA. Instantiating widget listbox nên càng đơn giản như:Các yếu tố tùy chỉnh và khả năng truy cập
<x-listbox>
<x-option>Option 1</x-option>
<x-option>Option 2</x-option>
</x-listbox>
Đối với mục đích của sự sạch sẽ và đóng gói, mọi thứ khác nên được trả lại trong bóng tối dom. Để triển khai tiện ích con này, hai thành phần tùy chỉnh, <x-listbox>
và <x-option>
được đăng ký. Yếu tố cấp cao nhất của các dom bóng của <x-listbox>
là một <div>
rằng mang role=listbox
và aria-activedescendent
thuộc tính cho khả năng tiếp cận (Tôi không muốn những thuộc tính này trên các yếu tố <x-listbox>
vì họ là những chi tiết thực hiện.)
Để cho aria-activedescendent
để hoạt động, một id cần trên các yếu tố tùy chọn. Đặt id trực tiếp trên các phần tử <x-option>
sẽ không hoạt động vì hai lý do: Thứ nhất, nó sẽ làm ô nhiễm không gian tên id của tài liệu sử dụng tiện ích hộp danh sách. Thứ hai và thậm chí quan trọng hơn, id không hoạt động trên các ranh giới bóng tối (đó là một mục đích của bóng tối), vì vậy các id của các tùy chọn phải sống trong cùng một mái vòm như <div>
với thuộc tính aria-activedescendent
.
Một giải pháp cho điều này sẽ là bao quanh mỗi <x-option>
được hiển thị dưới dạng nội dung bên trong vòm bóng của <x-listbox>
với một số khác <div>
(thuộc về bóng tối đó), có thể đặt id.
Câu hỏi của tôi là: Đây có phải là cách đúng đắn để đi và làm thế nào để thực hiện điều này bằng cách sử dụng các yếu tố tùy chỉnh và bóng tối apis dom web?
Mặc dù điều này sẽ hoạt động theo khả năng truy cập, nó đi ngược lại mục tiêu đóng gói của tôi (vì phần tử chọn không phải là một phần của HTML được cung cấp sẽ xuất hiện trong DOM ánh sáng). Thứ hai, nếu tôi thử tương tự với một widget phức tạp hơn (ví dụ một hộp danh sách có các tùy chọn chứa nhiều văn bản), tôi sẽ phải thay thế phần tử chọn bằng một tiện ích phù hợp với aria-customing, điều này có nghĩa là tôi sẽ có để tăng gấp đôi x-listbox của tôi. – Marc