jquery содержит не найденный предыдущий класс

#jquery #contains

#jquery #содержит

Вопрос:

 <div id='id1' class="mainDiv">Something</div>
<div class="dispatch" id="dis1">Dispatch</div><table><tr><td>Just</td><td>a table</td></tr></table>  
<div class='orderDiv'>Something else</div>  

<div id='id2' class="mainDiv">Something</div>
<div class="dispatch" id="dis2">Dispatch</div><table><tr><td>Just</td><td>a table</td></tr></table>  
<div class='orderDiv'>KEYWORD</div>  

<div id='id3' class="mainDiv">Something</div>
<div class="dispatch" id="dis3">Dispatch</div><table><tr><td>Just</td><td>a table</td></tr></table>  
<div class='orderDiv'>Something else</div>
  

Я хотел бы, чтобы для id1 и id3 были установлены значения display: none путем поиска по отсутствию «КЛЮЧЕВОГО СЛОВА».

Я пытался

 $(".orderDiv")
    .not(':contains("KEYWORD")')
    .prevAll('.mainDiv:first')
    .css('display','none');
  

но это только сделает id1 невидимым.

Обновить:
Все JSFiddle сработало, спасибо, но это не будет работать с моей оригинальной html-структурой, которую я теперь обновил выше. Также было бы здорово скрыть dis1 и dis3.

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

1. Вы хотите скрыть только id1 и id3

2. Обновил мой ответ, это должно работать с вашей новой структурой

Ответ №1:

Вы можете использовать функцию filter:

 $('.mainDiv').filter(function() {
    return !$(this).next('.orderDiv:contains(KEYWORD)').length;
}).hide();
  

Пример

Если вы хотите показать только соответствующий основной div и упорядоченный div, вы также можете выполнить цепочку из следующего до конца:

 .next('.orderDiv').hide();
  

Пример

Обновите согласно вашей правке

 var divs = $('.orderDiv').not(':contains(KEYWORD)')

divs.each(function() {
    var div = $(this);
    div.hide()
        .prev('table').hide()
        .prev('.dispatch').hide()
        .prev('.mainDiv').hide();
});
  

Скрипка

Если вы просто хотите скрыть mainDiv и dispatch

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

1. Есть идеи, почему $('.orderDiv:contains(KEYWORD)').show().prev('.mainDiv').show(); не сработает отображение .mainDiv найденного КЛЮЧЕВОГО СЛОВА (при условии, что для его отображения ранее было установлено значение none)?

2. поскольку mainDiv не является предыдущим классом orderDiv, вам придется выполнить $('.orderDiv:contains(KEYWORD)').show().prev('table').prev('.dispatch').prev('.mainDiv').show();

3. О, хорошо, спасибо, но если бы моя структура изменилась с помощью любого html-тега, это было бы уже неправильно. Есть ли способ найти последний class .mainDiv при поиске по ключевому слову-Match?

4. В этом случае я бы заключил каждую строку в div, тогда вы можете сделать $('.orderDiv:contains(KEYWORD)').show().parent().children('.mainDiv')

5. Спасибо, но он также покажет неправильный .mainDiv jsfiddle.net/FGcm4/11 (и, к сожалению, мы не можем изменить структуру div — это закрытая система)

Ответ №2:

это скроет id1 и id3

     $(".orderDiv").not(':contains("KEYWORD")').prevAll('.mainDiv').not(':eq(1)').each(function()
         {
         $(this).css('display','none')
      });
  

ДЕМОНСТРАЦИЯ