Гарне питання. На той момент, коли його запитували, не існував універсально реалізований спосіб робити "запити з укоріненими комбінаторами" (як їх називав Джон Ресіг ).
Тепер : введено псевдоклас сфери . Він не підтримується у [до-Chrominum] версіях Edge або IE, але він підтримується Safari вже кілька років. Використовуючи це, ваш код може стати:
let myDiv = getElementById("myDiv");
myDiv.querySelectorAll(":scope > .foo");
Зауважте, що в деяких випадках ви можете також пропустити .querySelectorAll
та використовувати інші хороші старомодні функції DOM API. Наприклад, замість myDiv.querySelectorAll(":scope > *")
вас можна було просто написати myDiv.children
, наприклад.
Інакше, якщо ви ще не можете покластися :scope
, я не можу придумати інший спосіб вирішити вашу ситуацію, не додавши більше власної логіки фільтра (наприклад, знайти myDiv.getElementsByClassName("foo")
чию .parentNode === myDiv
), і, очевидно, не ідеально, якщо ви намагаєтесь підтримати один шлях коду, який дійсно просто хоче взяти довільну рядок селектора як вхідний і список збігів як вихід! Але якщо, як я, ви в кінцевому підсумку задавали це питання просто тому, що ви застрягли, думаючи, що "у вас був молоток", не забувайте, що існує ще безліч інших інструментів, які DOM пропонує.