Я использую dojo.query
, который внутренне использует селекторы CSS3, чтобы определить, какие элементы вы хотите получить.
Я пытаюсь найти все элементы с тегом "foo", но только самые внешние (т. Е. Разрешено встраивать один "foo" в другой, и я хочу их игнорировать). Внешние элементы могут появляться на любом уровне документа, вложенные почти в любой другой элемент.
Конечно, dojo.query('foo')
возвращает все элементы foo, включая вложенные (которые мне не нужны).
Моя следующая попытка была dojo.query('foo:not(foo foo)')
, но это не дает результатов (поскольку селекторы потомков не являются «простыми селекторами», поэтому не поддерживаются :not
).
Я знаю, что обычным решением уровня CSS для такого рода вещей является определение двух правил (foo
и foo foo
), чтобы вложенные элементы можно было обрабатывать по-разному. Но это не сработает в этом случае (так как это всего лишь один выбор). (Это также кажется мне неубедительным в реальном CSS, поскольку вложенные элементы все равно получают первое правило, примененное к ним в любом случае, что делает невозможным использование значения по умолчанию для браузера или родительского элемента для чего-то, что было нарушено первым правилом.)
Если это помогает, по крайней мере, в тот момент, когда один foo находится внутри другого, он должен быть прямым потомком, хотя они могут оказаться вложенными на любой произвольный уровень. (т. е. 'foo> foo' также будет успешно соответствовать всем вложенным элементам foo, но, к сожалению, это все равно противоположно тому, что я хочу.)
Редактировать : обходной путь, который я использую в данный момент, находится ниже, хотя я все еще надеюсь на что-то более элегантное (и более безопасное для предков, на случай, если может быть косвенное вложение) :
dojo.query('foo').forEach(function(foo) {
if (foo.parentNode.localName == 'foo') { return; }
// ...
});