Вы можете разделить ваш выбор в 2 шага, сначала вы получаете элементы без .hidden
, затем вы выбираете последний внутри последний .Я не думаю, что у вас будет шанс с чистым CSS
var last = document.querySelectorAll('#root > .dir:not(.hidden) > .dir:not(.hidden)');
var element = last[last.length - 1].querySelector('.file:last-child');
console.log(element.innerHTML);
<div id='root'>
<div class='dir'>
<div class='dir'>
<div class='file'>1</div>
<div class='file'>2</div>
<div class='file'>3</div>
</div>
</div>
<div class='dir'>
<div class='dir'>
<div class='file'>4</div>
<div class='file'>5</div>
<div class='file'>6</div>
</div>
</div>
<div class='dir hidden'>
<div class='dir'>
<div class='file'>7</div>
<div class='file'>8</div>
<div class='file'>9</div>
</div>
</div>
</div>
Другой пример:
var last = document.querySelectorAll('#root > .dir:not(.hidden) > .dir:not(.hidden)');
var element = last[last.length - 1].querySelector('.file:last-child');
console.log(element.innerHTML);
<div id='root'>
<div class='dir'>
<div class='dir'>
<div class='file'>1</div>
<div class='file'>2</div>
<div class='file'>3</div>
</div>
</div>
<div class='dir'>
<div class='dir'>
<div class='file'>4</div>
<div class='file'>5</div>
<div class='file'>6</div>
</div>
</div>
<div class='dir'>
<div class='dir hidden'>
<div class='file'>7</div>
<div class='file'>8</div>
<div class='file'>9</div>
</div>
</div>
</div>
Другая идея состоит в том, чтобы выбрать все последние .file
, а затем запустить тест из последнего, чтобы увидеть, есть ли предок с классом .hidden
,В отличие от предыдущего решения это будет работать с любым уровнем вложенности.
//got from this answer https://stackoverflow.com/a/16863971/8620333
function hasSomeParentTheClass(element, classname) {
if (element.classList.contains(classname)) return true;
return element.parentElement && hasSomeParentTheClass(element.parentElement, classname);
}
var elements = document.querySelectorAll('.file');
var i = elements.length - 1;
for (; i >= 0; i--) {
if (!hasSomeParentTheClass(elements[i], 'hidden')) {
break;
}
}
console.log(elements[i].innerHTML);
<div id='root'>
<div class='dir'>
<div class='dir'>
<div class='file'>1</div>
<div class='file'>2</div>
<div class='file'>3</div>
</div>
</div>
<div class='dir'>
<div class='dir'>
<div class='file'>4</div>
<div class='file'>5</div>
<div class='file'>6</div>
</div>
</div>
<div class='dir'>
<div class='dir '>
<div class='file'>10</div>
<div class='dir hidden'>
<div class='file'>7</div>
<div class='file'>8</div>
<div class='file'>9</div>
</div>
</div>
</div>
</div>
Отредактировано OP: удалено :last-child
, если файл 10 существует.