поиск элемента учитывая его содержание
как на чистом js, "одной строкой", найти tr-ы содержащие оба блока
<tr> <th></th> <td></td> </tr> |
Что такое "блок"?
|
в примере tr содержит два блока th и td
doc.querySelectorAll("tr").forEach((e,i)=>{ let th=e.querySelector("th"); let td=e.querySelector("td") if (th && td){ console.log('наш вариант') } }) тоже самое, но без перебора можно сделать? еще в doc.querySelectorAll("tr .... ") отобрать сразу нужные, содержащие th и td |
CSS не умеет искать по содержимому. Соответственно одной строкой - никак(если конечно не положить в эту в строку весь код ручного поиска). Ну ещё можно с помощью xpath, но не нужно.
|
Современные браузеры, которые поддерживают псевдокласс has (почти все, кроме FF) должны взять
doc.querySelectorAll("tr:has(th):has(td)") |
od0201,
let trs = [...document.querySelectorAll('tr > td ~ th, tr > th ~ td')].map(({parentNode}) => parentNode); |
рони,
В общем случае не сработает В ситуации <td><th><td> или <th><td><th> мы найдем и th и td, как разные элементы. Родитель у них один, но он будет повторяться 2 раза в выходном массиве. |
рони, тут ещё надо на уникальность почитить, на случай td ~ th ~ td.)
voraa, не поддерживается в FF - идёт нахрен. Не надо тут вторую эпоху IE разводить.) P.S. Вроде красиво же? document.evaluate("//tr[td and th]", document)А подвох в том, что оно не массив возвращает и всё равно ручками по циклу пройтись придётся.) |
:)
[...new Set([...document.querySelectorAll('tr > td ~ th, tr > th ~ td')].map(({parentNode}) => parentNode))] |
спасибо, именно это мне и нужно было.
|
Часовой пояс GMT +3, время: 12:46. |