Как получить предыдущее значение h3 при просмотре списка найденных элементов? - PullRequest
0 голосов
/ 24 октября 2019

Как я могу получить предыдущий контент h3, когда перебираю свой список?

    var statusLabel= $("ul li:contains('Status: MyStatus')");

    for(i = 0; i < statusLabel.length; i++) {
          // How to i get the previous h3 content of each statusLabel
    }

Пример иерархии html:

<a>
<h3>ToBeExtracted</h3>
    <div class="description">
    </div>
<ul>
    <li>Status: My status</li>
</ul>  

1 Ответ

1 голос
/ 24 октября 2019

С помощью jquery вы можете запустить цикл «для каждого» непосредственно на объекте jquery следующим образом:

$("ul li:contains('Status: My status')").each(function(i,li){
  console.log('h3:',$(li).closest('ul').prevAll('h3:first').text());
});  
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h3>ToBeExtracted 1</h3>
    <div class="description">
    </div>
<ul>
    <li>some padding</li>
    <li>and some more ...</li>
    <li>Status: My status</li>
</ul>
<h3>ToBeExtracted 2</h3>
    <div class="description">
    </div>
<ul>
    <li>some padding</li>
    <li>and some more ...</li>
    <li>Status: My status</li>
    <li>some padding</li>
    <li>and some more ...</li>
</ul>  
<h3>ToBeExtracted 3</h3>
<div class="description">A Div in between ...
</div>
<ul>
    <li>and</li>
    <li>Status: My status</li>
    <li>some</li>
    <li>more</li>
    <li>padding</li>
    <li>and</li>
    <li>some</li>
    <li>more</li>
    <li>padding</li>
</ul>

Сначала нужно «подняться» до элемента <ul>, а затем оглянуться назад (.prevAll('h3:first')) на тот же уровень, пока не встретится первый<h3> element.


Редактировать:

Вот второе, более надежное решение Vanilla JS, которое может работать с любым документомструктура. Он просто просматривает последовательность элементов <h3> и <li> - независимо от того, как они сложены - и возвращает требуемые попадания:

var h3,res=[];
[...document.querySelectorAll('h3,li')].forEach(e=>{
 if(e.nodeName=='H3') h3=e;
 if(e.nodeName=='LI' &&
  e.innerText.indexOf('Status: My')>-1) res.push(h3.innerText);
});
console.log(res);
 
<h3>ToBeExtracted 1</h3>
    <div class="description">
    </div>
<div>
  this is a div, encasing the first UL section
  <ul>
    <li>some padding</li>
    <li>and some more ...</li>
    <li>Status: My status</li>
  </ul>
  end of container-div
</div>
<h3>ToBeExtracted 2</h3>
    <div class="description">
    </div>
<ul>
    <li>some padding</li>
    <li>and some more ...</li>
    <li>Status: My status</li>
    <li>some padding</li>
    <li>and some more ...</li>
</ul>  
<h3>ToBeExtracted 3</h3>
<div class="description">A Div in between ...
</div>
<ul>
    <li>and</li>
    <li>Status: My status</li>
    <li>some</li>
    <li>more</li>
    <li>padding</li>
    <li>and</li>
    <li>some</li>
    <li>more</li>
    <li>padding</li>
</ul>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...