Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   поиск элемента учитывая его содержание (https://javascript.ru/forum/misc/85282-poisk-ehlementa-uchityvaya-ego-soderzhanie.html)

od0201 05.06.2023 20:41

поиск элемента учитывая его содержание
 
как на чистом js, "одной строкой", найти tr-ы содержащие оба блока
<tr>
<th></th>
<td></td>
</tr>

voraa 05.06.2023 21:00

Что такое "блок"?

od0201 05.06.2023 21:07

в примере 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

Aetae 05.06.2023 21:08

CSS не умеет искать по содержимому. Соответственно одной строкой - никак(если конечно не положить в эту в строку весь код ручного поиска). Ну ещё можно с помощью xpath, но не нужно.

voraa 05.06.2023 21:18

Современные браузеры, которые поддерживают псевдокласс has (почти все, кроме FF) должны взять
doc.querySelectorAll("tr:has(th):has(td)")

рони 05.06.2023 21:21

od0201,
let trs = [...document.querySelectorAll('tr > td ~ th, tr > th ~ td')].map(({parentNode}) => parentNode);

voraa 05.06.2023 21:26

рони,
В общем случае не сработает
В ситуации <td><th><td> или <th><td><th> мы найдем и th и td, как разные элементы. Родитель у них один, но он будет повторяться 2 раза в выходном массиве.

Aetae 05.06.2023 21:27

рони, тут ещё надо на уникальность почитить, на случай td ~ th ~ td.)

voraa, не поддерживается в FF - идёт нахрен. Не надо тут вторую эпоху IE разводить.)


P.S. Вроде красиво же?
document.evaluate("//tr[td and th]", document)
А подвох в том, что оно не массив возвращает и всё равно ручками по циклу пройтись придётся.)

рони 05.06.2023 21:42

:)
[...new Set([...document.querySelectorAll('tr > td ~ th, tr > th ~ td')].map(({parentNode}) => parentNode))]

od0201 07.06.2023 13:48

спасибо, именно это мне и нужно было.


Часовой пояс GMT +3, время: 12:46.