Câu hỏi hay. Vào thời điểm nó được yêu cầu, một cách được triển khai trên toàn cầu để thực hiện "truy vấn gốc tổ hợp" (như John Resig đã gọi chúng là ) không tồn tại.
Bây giờ lớp giả : scope đã được giới thiệu. Nó không được hỗ trợ trên các phiên bản [pre-Chrominum] của Edge hoặc IE, nhưng đã được Safari hỗ trợ trong một vài năm. Sử dụng điều đó, mã của bạn có thể trở thành:
let myDiv = getElementById("myDiv");
myDiv.querySelectorAll(":scope > .foo");
Lưu ý rằng trong một số trường hợp, bạn cũng có thể bỏ qua .querySelectorAll
và sử dụng các tính năng DOM API kiểu cũ tốt khác. Ví dụ, thay vì myDiv.querySelectorAll(":scope > *")
bạn có thể chỉ viết myDiv.children
chẳng hạn.
Mặt khác, nếu bạn chưa thể dựa vào :scope
, tôi không thể nghĩ ra cách khác để xử lý tình huống của bạn mà không thêm logic bộ lọc tùy chỉnh hơn (ví dụ: tìm myDiv.getElementsByClassName("foo")
của ai .parentNode === myDiv
) và rõ ràng là không lý tưởng nếu bạn đang cố gắng hỗ trợ một đường dẫn mã thực sự chỉ muốn lấy một chuỗi bộ chọn tùy ý làm đầu vào và danh sách các kết quả phù hợp làm đầu ra! Nhưng nếu giống như tôi, bạn đã hỏi câu hỏi này đơn giản vì bạn mắc kẹt khi nghĩ rằng "tất cả những gì bạn có là một cái búa", đừng quên rằng có rất nhiều công cụ khác mà DOM cũng cung cấp.