#javascript #jquery
#javascript #jquery
Вопрос:
вот моя разметка:
<div>
<h3>Title</h3>
<ul class="eventslist">
<li>This event would be discarded</li>
<ul>
<li>...</li>
<li>...</li>
</ul>
</li>
</ul>
</div>
<div>
<h3>Title</h3>
<ul class="eventslist">
<li>Earnings - This event would be included</li>
<ul>
<li>...</li>
<li>...</li>
</ul>
</li>
</ul>
</div>
Мне нужна помощь в написании условия, которое проходило бы через каждый UL class =»eventslist» на странице и проверяло, что первый элемент LI в UL class =»eventslist» содержит слово «Доход» (оно может быть где угодно в тексте, и капитализацию следует игнорировать). Если этого не произойдет, весь DIV, обернутый вокруг UL, должен быть удален вместе со всем, что внутри него.
Любая помощь приветствуется!
Комментарии:
1. Возможно ли предоставить тем, у кого есть доход, определенный идентификатор? это сделает это намного проще… Поскольку вы генерируете это с помощью серверного скрипта, заставьте серверный код проверить, работает ли it.StartsWith(«Заработает»), а затем добавьте идентификатор в тег li
2. Нет, к сожалению, у меня нет контроля над разметкой — я должен был указать это.
Ответ №1:
Этот jQuery будет делать то, что вы хотите:
$(document).ready(function(){
$(".eventslist").filter(function(){
var text = $(this).children("li:first").text();
return !/earnings/i.test( text );
}).closest("div").remove();
});
Пример jsFiddle:http://jsfiddle.net/dGKMj/2 /
Комментарии:
1. Да. Я все еще писал свой код, когда вы опубликовали свой. Рад, что я был на правильном пути.
Ответ №2:
$('ul.eventslist').filter(function () {
return !$(this).find('li:first').text().match(/earnings/i);
}).parent().remove();
Объяснение:
- Выполняется
.filter()
в.eventslist
списках и сохраняет только те, которых нетeanings
где-то в первомli
. - Удаляет родительский элемент (в основном
div
) этих списков. Вместоparent()
вы также можете использоватьclosest('div')
, если разметка может измениться. Наиболее пуленепробиваемым было бы присвоить класс родительскомуdiv
, а затем использоватьclosest('div.container')
.
Комментарии:
1. большое спасибо bazmegakapa — я отдал чек Tomgrohl, потому что он ответил первым, но ваш так же хорош, очень признателен!
Ответ №3:
Хотя приведенные выше ответы работают, я предпочитаю простоту селекторов jQuery.
$('ul.eventslist > li:first-child').not(":contains('Earnings'), :contains('earnings')").closest('div').remove();
Я думаю, что это намного проще прочитать и обновить позже. <— Это мое мнение
Комментарии:
1. Необходимость указывать две версии
Earnings
не заставляет меня говорить: «Хм, как легко это обновить позже!» Я также не уверен, сработает ли это.2. Проблема с этим заключается в том, что если в
.eventslist
списке будет более одного элемента списка, код перестанет работать: jsfiddle.net/bazmegakapa/8Wx7x .3. @bazmegakapa — Хотелось бы, чтобы он не учитывал регистр или чтобы я тоже мог использовать какое-нибудь регулярное выражение. Но я не рассматриваю это как большой шаг назад. Очень ясно, что делают селекторы, и это плюс. Кроме того, две версии ‘Earnings’ — это именно то, что он указал.
4. @natedavisolds Если вы добавите другой
li
(я добавил один ко второмуul
), он удалитdiv
, даже если этого не должно быть. О ваших селекторах: они работают нормально, только не говорите, что они более удобны в обслуживании. Для меня, например, синтаксисfilter
очень интуитивно понятен.5. @bazmegakapa — ах да. Я обновил селектор, чтобы проверять только первого дочернего элемента.