Pertanyaan bagus. Pada saat diminta, cara yang diterapkan secara universal untuk melakukan "kueri yang di-rooting kombinator" (sebagaimana John Resig menyebutnya ) tidak ada.
Sekarang pseudo-class : scope telah diperkenalkan. Ini tidak didukung pada Edge atau IE versi [pra-Chrominum], tetapi telah didukung oleh Safari selama beberapa tahun. Dengan menggunakan itu, kode Anda bisa menjadi:
let myDiv = getElementById("myDiv");
myDiv.querySelectorAll(":scope > .foo");
Perhatikan bahwa dalam beberapa kasus Anda juga dapat melewati .querySelectorAll
dan menggunakan fitur API DOM model lama yang bagus. Misalnya saja myDiv.querySelectorAll(":scope > *")
Anda bisa langsung menulismyDiv.children
, misalnya.
Sebaliknya, jika Anda belum dapat mengandalkan :scope
, saya tidak dapat memikirkan cara lain untuk menangani situasi Anda tanpa menambahkan lebih banyak logika filter khusus (misalnya, temukan myDiv.getElementsByClassName("foo")
siapa .parentNode === myDiv
), dan jelas tidak ideal jika Anda mencoba mendukung satu jalur kode yang benar-benar hanya ingin mengambil string pemilih arbitrer sebagai masukan dan daftar kecocokan sebagai keluaran! Tetapi jika seperti saya, Anda akhirnya menanyakan pertanyaan ini hanya karena Anda terjebak berpikir "yang Anda miliki hanyalah palu" jangan lupa ada berbagai alat lain yang ditawarkan DOM juga.