CSS3 селектор для «не потомок» или «найти внешнее»? - PullRequest
3 голосов
/ 29 июля 2011

Я использую 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; }
    // ...
});

1 Ответ

1 голос
/ 29 июля 2011

Если это всегда будут прямые потомки, тогда вы можете сделать

dojo.query("foo").filter(function(item) {
    return (item.parentNode.nodeName.toLowerCase() !== "foo");
})
...