как удалить все элементы с определенным innerHTML

#javascript #html #jquery

Вопрос:

 function checkIfBlank() {
  let li = document.getElementsByClassName("li");
  for (var i = 0; i < li.length; i  ) {
  if (li[i].innerHTML === "hello") {
    li[i].parentElement.remove();
  }
  }
}
 
 <li>
    <span class="li">hi</span>
</li>
<li>
    <span class="li">hi</span>
</li>
<li>
    <span class="li">hi</span>
</li>
<li>
    <span class="li">hello</span>
</li>
<li>
    <span class="li">hello</span>
</li>
<li>
    <span class="li">hello</span>
</li>
 

у меня есть эта функция, которая удалит родительский элемент промежутка, у которого есть внутренний текст «привет».

В этом случае я ожидаю, что код удалит все элементы с помощью innerHTML hello

но оказывается, что он удаляет только один элемент при выполнении функции

кто-нибудь может мне в этом помочь? я не очень хорош xD

Комментарии:

1. Вот так ?

Ответ №1:

Для таких целей его безопаснее использовать Array.from(element) .

 function checkIfBlank() {
    let li = document.getElementsByClassName("li");
    Array.from(li).forEach(function (li_curr) {
        if (li_curr.innerHTML == "hello") {
            li_curr.parentElement.remove();
        }
    });
}

checkIfBlank(); 
 <ul>
    <li>
        <span class="li">hi</span>
    </li>
    <li>
        <span class="li">hi</span>
    </li>
    <li>
        <span class="li">hi</span>
    </li>
    <li>
        <span class="li">hello</span>
    </li>
    <li>
        <span class="li">hello</span>
    </li>
    <li>
        <span class="li">hello</span>
    </li>
</ul> 

Решение jQuery:

 $('li:contains("hello")').remove(); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<ul>
    <li>
        <span class="li">hi</span>
    </li>
    <li>
        <span class="li">hi</span>
    </li>
    <li>
        <span class="li">hi</span>
    </li>
    <li>
        <span class="li">hello</span>
    </li>
    <li>
        <span class="li">hello</span>
    </li>
    <li>
        <span class="li">hello</span>
    </li>
</ul> 

Комментарии:

1. привет, спасибо за ответ, почему лучше использовать array.from?

2. @coder, Потому что это он предназначен для тех же задач, что и ваш. для {} цикл выполняет операцию n раз и может не попадать в интервал из n элементов. Я сам столкнулся с подобной проблемой. Но вы вполне можете использовать решение jquery, которое дал вам другой респондент. Кстати, этот ответ может быть сокращен как — $(‘.li:содержит(«привет»)’).родитель().удалить(); или $(‘li:содержит(«привет»)’).удалить();. Я указал на это в своем втором решении.

Ответ №2:

вы можете использовать jquery для удаления li с текстом соответствия, я надеюсь, вы получите свой ответ .

 $('li:contains("hello")')
 .next('span').remove().end()
 .remove(); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<li>
    <span class="li">hi</span>
</li>
<li>
    <span class="li">hi</span>
</li>
<li>
    <span class="li">hi</span>
</li>
<li>
    <span class="li">hello</span>
</li>
<li>
    <span class="li">hello</span>
</li>
<li>
    <span class="li">hello</span>
</li> 

наслаждайтесь моим кодом 😉

Комментарии:

1. если вам нужна какая-либо помощь, напишите мне, что я рад вам помочь .

Ответ №3:

Вы уверены, что нет ни одного, который выглядел бы так:

 <span class="li">
    Hello
</span>
 

Вместо этого:

 <span class="li">Hello</span>
 

Первое, что мне пришло в голову, было то, что если есть какой-либо разрыв строки или пробел, то вам определенно нужно будет запустить .trim() в этой строке innerHTML. Однако, если это не так, я бы предложил кучу console.log () в определенных местах, чтобы посмотреть, как далеко он заходит в цикле for.